• # Bien suivre les allocations mémoire

    Posté par . 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 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).