Je confirme, ce n'est pas la valeur allouée qui détruite.
Quand on alloue de la mémoire, la fonction malloc() retourne un pointeur. Ce pointeur sert à 2 choses:
- il désigne la zone où on y mettra des données
- il ne faut pas perdre cette valeur, car il faudra la fournir à free() au moment de libérer cette mémoire.
Ici tu mémorises dans num une zone allouée.
Plus loin tu appelles list_rem_next(&list, le, &num);, et cette fonction va écraser ce qu'il y a dans num pour le remplacer par l'adresse de élément retiré de la liste. Les éléments insérés en *data dans la liste sont &a[0]&a[1]&a[2]&a[3], et au retour de list_rem_next(&list, le, (void**)&num);, num vaut un de ces 4 pointeurs. Eux pointent dans ton tableau qui est de la mémoire locale sans allocation, donc pas de libération à faire ici!
Il ne faut, dans ce cas, rien allouer dans num et ne rien libérer à la fin.
PS: et fais attention à ne pas apprendre un C trop ancien. Dans les années 80, on utilisait des macros pour optimiser des traitements courts, problème ces macros sont:
- difficile à lire/écrire
- sources d'erreurs : transcodage lié au principe des macros et non vérification des types.
Depuis les années 90, on utilise à la place les fonctions inline qui n'ont pas ces handicaps, elles ont été officialisées bien après (en 1999).
# Bien suivre les allocations mémoire
Posté par dalfab . En réponse au message implémentation d'une liste chaînée en langage c. Évalué à 5.
Je confirme, ce n'est pas la valeur allouée qui détruite.
Quand on alloue de la mémoire, la fonction
malloc()retourne un pointeur. Ce pointeur sert à 2 choses:- il désigne la zone où on y mettra des données
- il ne faut pas perdre cette valeur, car il faudra la fournir à
free()au moment de libérer cette mémoire.Ici tu mémorises dans
numune zone allouée.Plus loin tu appelles
list_rem_next(&list, le, &num);, et cette fonction va écraser ce qu'il y a dansnumpour le remplacer par l'adresse de élément retiré de la liste. Les éléments insérés en*datadans la liste sont&a[0]&a[1]&a[2]&a[3], et au retour delist_rem_next(&list, le, (void**)&num);,numvaut un de ces 4 pointeurs. Eux pointent dans ton tableau qui est de la mémoire locale sans allocation, donc pas de libération à faire ici!Il ne faut, dans ce cas, rien allouer dans
numet ne rien libérer à la fin.PS: et fais attention à ne pas apprendre un C trop ancien. Dans les années 80, on utilisait des macros pour optimiser des traitements courts, problème ces macros sont:
- difficile à lire/écrire
- sources d'erreurs : transcodage lié au principe des macros et non vérification des types.
Depuis les années 90, on utilise à la place les fonctions
inlinequi n'ont pas ces handicaps, elles ont été officialisées bien après (en 1999).