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 :

Que doit-on faire d'un pointeur récupéré à partir d'une fonction ?


Sujet :

C

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Que doit-on faire d'un pointeur récupéré à partir d'une fonction ?
    Bonjour,

    Soit la fonction ayant le prototype suivant :
    et une variable globale :
    Si dans un bloc, je l'utilise comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
        ...
        ptr = pouet();
        ....
    }
    Dois-je par la suite me soucier de la place que prennent les données pointées par ptr, si je n'en ai plus besoin ?

    Merci.

  2. #2
    Membre habitué Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    dans un cas comme celui-là, il faut faire l'allocation mémoire dans ta fonction pouet
    mais il faut pas oublier de désallouer le bloc une fois que tu ten sers pu, i.e faire un free(ptr)
    évidement il faut le placer au bon endroit (et pas faire de free dans la fonction pouet)

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    1. Pourquoi une variable globale ?
    2. Impossible de répondre sans savoir ce que fait pouet().

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ca n'est pas forcément plus clair que sur ton post précédent j'dois avouer

    • On ignore ce que fait pouet()
    • Il faut éviter autant que possible les variable globales et passer donc au maximum par les arguments
    • Qu'entend tu par "se soucier de la place que prennent les données pointées lorsque tu n'en as plus besoin" ? Les libérer ? Si c'est ca, oui il faut libérer les espaces plus utilisés !
    • Un exemple concret sur ce que tu veux faire serait mieux qu'un exemple factice même pas complet !

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    J'ai essayé de faire simple pour ne pas vous embrouiller, mais je m'aperçois qu'en fait, vous manquez d'éléments pour pouvoir répondre.

    Je présente donc les choses de manière plus précise :

    Soit la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct myStruct
    {
        ....
        char name[10];
        ....
    } myStruct;
    Soit une fonction qui renvoit un pointeur vers une "instance" de cette structure quand on lui communique un entier (référençant un jeu de données... enfin bref... peu importe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myStruct* getEntry(int);
    Et soit la fonction qui renvoie un pointeur vers le champ name quand on lui passe en paramètre un pointeur vers une structure myStruct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* getName(*myStruct);
    Ces deux fonctions sont issues d'une API, et je n'ai donc aucun contrôle sur leur définition.

    J'ai ensuite la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char** creationTableau(char** tab)
    {
        myStruct *structEntry;
        tab = malloc (10*sizeof (*tab));
     
        for (i = 0; i < max_node; i++)
        {
    		structEntry = getEntry(i);
    		tab[i] = getName(node_entry);
        }
    }
    Comment corretement libérer la mémoire occupée par tab ?
    Je n'ai pas de problème pour free(tab), mais c'est plutôt pour le contenu de tab...

  6. #6
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 572
    Points
    1 572
    Par défaut
    Bonjour en algoritmique ca donnerai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour chaque element du tableau
        desallouer element
     
    desallouer tableau

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par oodini Voir le message
    Comment corretement libérer la mémoire occupée par tab ?
    Je n'ai pas de problème pour free(tab), mais c'est plutôt pour le contenu de tab...
    Tout dépend de comment est retournée la chaîne par AiNodeEntryGetName ! Si c'est une allocation qui est faite pour stocker la chaine, tu peux faire comme BainE l'a expliqué.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Si c'est une allocation qui est faite pour stocker la chaine, tu peux faire comme BainE l'a expliqué.
    Je ne sais pas si c'est une allocation qui est faite.
    Tout ce que je sais de la fonction, vous le savez.
    Je n'ai que le prototype du .h.

    J'ai initialement essayé de faire comme l'explique BainE, mais ça plantait mon programme dans l'imbrication interne. J'en déduis donc qu'il n'y a aps allocation par malloc ou autre.

    Dois-je en déduire que je n'ai pas à me soucier de la libération de mémoire des éléments, et que j'ai juste à faire un free(tab) ?

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et soit la fonction qui renvoie un pointeur vers le champ name quand on lui passe en paramètre un pointeur vers une structure myStruct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* getName(*myStruct);
    Tu veux dire char * getName(myStruct *) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char** creationTableau(char** tab)
    {
        myStruct *structEntry;
        tab = malloc (10*sizeof (*tab));
     
        for (i = 0; i < max_node; i++)
        {
    		structEntry = getEntry(i);
    		tab[i] = getName(node_entry);
        }
    }
    Comment corretement libérer la mémoire occupée par tab ?
    Je n'ai pas de problème pour free(tab), mais c'est plutôt pour le contenu de tab...
    1. Inutile de passer tab en paramètre puique tu ne le lis pas.
    2. Impossible de répondre sans savoir ce que fait getEntry().
    3. De toute évidence, getEntry() utilise une ou plusieurs variables globales...

    Pour te libérer de l'influence de getEntry(), tu peux choisir de mettre une recopie des chaînes dans ton tableau plutôt que leurs adresse (en faisant tab[i] = strdup(getName(node_entry));, ou un équivalent plus standard).
    Dans ce cas, tu sauras qu'il faut faire un free() sur chaque entrée du tableau avant de faire faire un free() sur le tableau lui-même.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    1. Inutile de passer tab en paramètre puique tu ne le lis pas.
    2. Impossible de répondre sans savoir ce que fait getEntry().
    3. De toute évidence, getEntry() utilise une ou plusieurs variables globales...


    Pour te libérer de l'influence de getEntry(), tu peux choisir de mettre une recopie des chaînes dans ton tableau plutôt que leurs adresse (en faisant tab[i] = strdup(getName(node_entry));, ou un équivalent plus standard).
    Dans ce cas, tu sauras qu'il faut faire un free() sur chaque entrée du tableau avant de faire faire un free() sur le tableau lui-même.
    1. Ben je ne le lis pas, mais k'interveins dessus.

    2. Dommage...

    Et el fait que le free plante en suffit pas pour en déduire qu'il n'y a aps de désallocation à faire ?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    1. Eh ben, tu le déclares à l'intérieur de la fonction. De toute façon, tu le retournes...
    Je te rappelle que les variables sont passées par valeur. Si tu modifies directement le pointeur tab, ça n'aura aucun effet sur la fonction appelante...

    2. Il pourrait falloir désallouer autre chose. Impossible de savoir si ce n'est pas documenté.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    OK, merci d'insister sur le premier point, ça n'était pas superflu. :-)

    Quant au second point, c'est bien le problème de cette API... Doc quasi inexistante.

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/01/2008, 12h36
  2. Passer un pointeur en paramètre d'une fonction
    Par oranoutan dans le forum C
    Réponses: 18
    Dernier message: 11/09/2007, 21h48
  3. Réponses: 14
    Dernier message: 07/06/2007, 19h40
  4. Comment faire pour générer un fichier à partir d'une BD MySQL
    Par dessinateurttuyen dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/07/2006, 20h39

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