IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème d'allocation mémoire


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème d'allocation mémoire
    'soir

    J'ai juste une petite question sur l'allocation, en effet j'ai remarqué que lorsque l'on alloue dynamiquement un pointeur dans une fonction et que ce pointeur a été declaré dans la fonction appelante, l'allocation n'était pas pris "en compte".

    Comme un exemple vaut mieux qu'un long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void alloc_int(int *p)
    {
        p = malloc(sizeof *p);
     
        if(!p) exit(EXIT_FAILURE);
     
        *p = 5;
    }
     
    int main(void)
    {
        int *p = NULL;
     
        alloc_int(p);
     
        if(p)
        {
            printf("Valeur : %d", *p);
            free(p);
        }
        else
            puts("L'allocation n'est pas prise en compte");
     
        return EXIT_SUCCESS;
    }
    Pourquoi est-ce que je n'ai pas le message imprimant la valeur pointé par p ?
    Est-ce que c'est moi qui ai mal fait quelque chose ou est-ce que c'est dû à la durée de vie des données (l'espace alloué à p serait-donc libéré à la sortie de la fonction ?) ?

    Une dernière question, admetons que j'ai une fonction qui retourne 0 si elle échoue et 1 dans le cas contraire. Comment faire pour qu'un espace mémoire préalablement alloué dans cette même fonction soit accesible dans la fonction appelante sachant que je ne peux utiliser les paramètres comme le montre mon exemple ?

    Voilà, merci d'avance à ceux qui répondront

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    En C, les paramètres sont passés par valeur. Si tu veux modifier une variable, il faut passer la valeur de son adresse (i.e. un pointeur vers cette variable).
    Donc, si tu veux modifier la valeur d'un pointeur, il faut attendre un double pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void alloc_int(int **p)
    {
      int *l_p = malloc(sizeof *l_p);
      if(l_p)
      {
        *l_p = 5;
      }
      *p = l_p;
    }
    ou, plus propre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int *alloc_int(void)
    {
      int *l_p = malloc(sizeof *l_p);
      if(l_p)
      {
        *l_p = 5;
      }
      return l_p;
    }
    Remarque que le nom de ta fonction n'est pas très parlant, puisqu'elle ne fait pas qu'allouer de la mémoire pour un entier. Elle initialise également.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par DaZumba
    En C, les paramètres sont passés par valeur
    Effectivement, j'avais oublié que ce (gros) détail s'appliquait également aux pointeurs.

    Citation Envoyé par DaZumba
    Remarque que le nom de ta fonction n'est pas très parlant, puisqu'elle ne fait pas qu'allouer de la mémoire pour un entier. Elle initialise également.
    Comme la fonction ne servait qu'à titre d'exemple, j'ai pris le premier nom qui me passait par la tête :]

    Quoi qu'il en soit, mon problème est résolu, j'ai utilisé un pointeur temporaire dans ma fonction qui me posait problème comme dans ton exemple et ça fonctionne

    merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'allocation mémoire > 2Go
    Par tnarol dans le forum C++
    Réponses: 19
    Dernier message: 09/07/2008, 12h03
  2. Problème d'allocation mémoire
    Par Fibus dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 10/01/2008, 16h35
  3. Problème d'allocation mémoire
    Par elmayor1983 dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2007, 10h08
  4. Problème d'allocation mémoire et fork
    Par Conap dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2006, 15h34
  5. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo