[C] Allocation dynamique - Tableau et structu
Résolu/Fermé
Hylpoz
-
13 mars 2008 à 23:38
Hylpoz Messages postés 1 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 14 mars 2008 - 14 mars 2008 à 13:59
Hylpoz Messages postés 1 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 14 mars 2008 - 14 mars 2008 à 13:59
A voir également:
- [C] Allocation dynamique - Tableau et structu
- Tableau croisé dynamique - Guide
- Tableau word - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Tableau ascii - Guide
- Trier tableau excel - Guide
4 réponses
size_t Taille_alloc_fils = (i_Ptr_noeud->Nb_fils + 1) * sizeof(t_Noeud*);
tu as raison, c'est moi qui m'étais trompé
Pour ce qui est d'affecter NULL aux pointeurs désalloués, ça n'est demandé ni par la syntaxe, ni par la logique. On entre dans le domaine des goûts et des couleurs. L'aspect pratique, c'est que tu est sûr que tu n'as plus rien à désallouer, et que tu peux tester la valeur d'un pointeur avant de t'en servir, ce qui peut être utile pour le debogage.
Dans ton cas précis, affecter NULL aux fils ne sert à rien, ils ne seront plus accessibles de toutes manières dès que tu auras affecté NULL au parent.
tu as raison, c'est moi qui m'étais trompé
Pour ce qui est d'affecter NULL aux pointeurs désalloués, ça n'est demandé ni par la syntaxe, ni par la logique. On entre dans le domaine des goûts et des couleurs. L'aspect pratique, c'est que tu est sûr que tu n'as plus rien à désallouer, et que tu peux tester la valeur d'un pointeur avant de t'en servir, ce qui peut être utile pour le debogage.
Dans ton cas précis, affecter NULL aux fils ne sert à rien, ils ne seront plus accessibles de toutes manières dès que tu auras affecté NULL au parent.
Bonjour
Remarque préliminaire :
ce ne serait pas plutôt :
Question 1 :
Non, la signature de la fonction n'a pas à changer. Elle a toujours besoind des mêmes paramètres en entrée, ni plus ni moins et elle reste de type void.
Question 2 :
Tu passes une copie d'un pointeur. Mais ce que tu modifies dans ta fonction, ce n'est pas le pointeur, c'est la variable pointée. Or un pointeur et sa copie contiennent l'adresse de la même zone mémoire : toute modification de la zone mémoire pointée par l'un modifie la zone mémoire pointée par l'autre, puisque c'est la même !
Le problème aurait été tout différent si dans ta fonction tu faisais un i_Ptr_noeud=malloc(..) ou realloc(..)
Question 3 :
un Free à la racine de l'arbre ne suffit pas : la fonction free ne connaît rien de ta structure et est donc incapable de parcourir tous les noeuds. Tu es effectivement obligé de les libérer toi-même. Une fonction récursive, qui bien sûr libère les fils avant le noeud parent, est le meilleur moyen de le faire.
La signature que tu proposes me semble tout à fait convenir : là encore, tu ne cherches pas à récupérer une valeur modifiée du pointeur (tu en ferais quoi ?)
Remarque préliminaire :
size_t Taille_alloc_fils = i_Ptr_noeud->Nb_fils + 1;
ce ne serait pas plutôt :
size_t Taille_alloc_fils = (i_Ptr_noeud->Nb_fils + 1) * sizeof(unsigned int);
Question 1 :
Non, la signature de la fonction n'a pas à changer. Elle a toujours besoind des mêmes paramètres en entrée, ni plus ni moins et elle reste de type void.
Question 2 :
Tu passes une copie d'un pointeur. Mais ce que tu modifies dans ta fonction, ce n'est pas le pointeur, c'est la variable pointée. Or un pointeur et sa copie contiennent l'adresse de la même zone mémoire : toute modification de la zone mémoire pointée par l'un modifie la zone mémoire pointée par l'autre, puisque c'est la même !
Le problème aurait été tout différent si dans ta fonction tu faisais un i_Ptr_noeud=malloc(..) ou realloc(..)
Question 3 :
un Free à la racine de l'arbre ne suffit pas : la fonction free ne connaît rien de ta structure et est donc incapable de parcourir tous les noeuds. Tu es effectivement obligé de les libérer toi-même. Une fonction récursive, qui bien sûr libère les fils avant le noeud parent, est le meilleur moyen de le faire.
La signature que tu proposes me semble tout à fait convenir : là encore, tu ne cherches pas à récupérer une valeur modifiée du pointeur (tu en ferais quoi ?)
Bonjour le père, et merci pour tes réponses.
J'ai encore quelques questions pour toi suite à ton intervention...
Merci je vois que j'ai juste mis le nombre de case mémoire que je veux réserver mais pas leur taille...
Je fais un tableau de pointeur en gros, donc
Oui je comprends maintenant, j'ai confondu le pointeur que je passe en paramètre et mon tableau de pointeur sur la suite de l'arbre.
Donc si j'ai compris, puisque je modifie le noeud repéré les paramètres sont bons.
En fait, je pensais que si je passais par recopie le pointeur, la libération n'aurait pas eu lieu...
Une dernière question concernant ma fonction de libération mémoire:
Après la libération d'un noeud, est-il conseillé d'affecter le pointeur à null?
Voila la fonction en question:
J'ai encore quelques questions pour toi suite à ton intervention...
Remarque préliminaire : size_t Taille_alloc_fils = i_Ptr_noeud->Nb_fils + 1; ce ne serait pas plutôt : size_t Taille_alloc_fils = (i_Ptr_noeud->Nb_fils + 1) * sizeof(unsigned int);
Merci je vois que j'ai juste mis le nombre de case mémoire que je veux réserver mais pas leur taille...
Je fais un tableau de pointeur en gros, donc
size_t Taille_alloc_fils = (i_Ptr_noeud->Nb_fils + 1) * sizeof(unsigned int); doit être size_t Taille_alloc_fils = (i_Ptr_noeud->Nb_fils + 1) * sizeof(t_Noeud*); non? Ou est-ce peut être la même chose?
Question 1 : Non, la signature de la fonction n'a pas à changer. Elle a toujours besoin des mêmes paramètres en entrée, ni plus ni moins et elle reste de type void.
Oui je comprends maintenant, j'ai confondu le pointeur que je passe en paramètre et mon tableau de pointeur sur la suite de l'arbre.
Donc si j'ai compris, puisque je modifie le noeud repéré les paramètres sont bons.
Question3: [...]
En fait, je pensais que si je passais par recopie le pointeur, la libération n'aurait pas eu lieu...
Une dernière question concernant ma fonction de libération mémoire:
Après la libération d'un noeud, est-il conseillé d'affecter le pointeur à null?
Voila la fonction en question:
void Liberer_noeud(t_Noeud *i_Ptr_Noeud) { unsigned short i; //libération des noeuds fils for ( i = 0 ; i < i_Ptr_Noeud->Nb_fils ; i++ ) { Liberer_noeud(i_Ptr_Noeud->Fils[i]); i_Ptr_Noeud->Fils[i] = NULL; } free(i_Ptr_Noeud); }
Hylpoz
Messages postés
1
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
14 mars 2008
14 mars 2008 à 13:59
14 mars 2008 à 13:59
Ok c'est parfait tu as répondu à toutes mes questions :)
En tout cas, je te remercie pour ta patience et ton efficacité!
En tout cas, je te remercie pour ta patience et ton efficacité!