[Langage C] un free qui ne libère rien

Fermé
marmotte - 24 févr. 2009 à 12:51
 marmotte - 24 févr. 2009 à 13:12
Bonjour,
le but de ce code est de faire une liste simplement chainée, avec quelques fonctions bateaux, ajout, taille, détruit...
j'ai un problème avec la fonction "detruit" qui ne détruit rien au final :
je vous montre le code :

# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>

typedef struct s_list *t_list;

struct s_list {
int elem;
t_list suiv;
};

t_list ajout(int x, t_list l)
{
t_list p ;
p = malloc (sizeof (struct s_list));
p->elem = x ;
p->suiv = l;
return (p);
}

size_t taille(t_list l)
{
size_t count;
count = 0;
while (l != NULL){
count++;
l = l->suiv;
}
return (count);
}

void detruit(t_list l)
{
t_list l2;
while (l!= NULL){
l2 = l ;
l=l->suiv;
free(l2);
l2 = NULL;
}
}

int main()
{
int i;
t_list l = NULL ;

for (i=0; i<100; i++)
l = ajout(i,l);
printf("\nit's gona be 99\n%i\n",l->elem);
printf("taille(l)=%d\n",taille(l));
detruit(l);
printf("taille(l)=%d\n",taille(l));
exit(0);
}



Voilà, la taille renvoi donc 100 ds un premier temps puis ensuite au lieu de renvoyer 0, elle renvoit à nouveau 100, ce qui n'est pas normal.
Sinon aucune erreur à la compilation, mais si quelqu'un pouvait me dire pourquoi detruit ne fais rien, ça serait chouette.
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
24 févr. 2009 à 13:02
Salut,
C'est normal, tu ne libères pas le pointeur mais une copie du pointeur. Il ne faut pas oublier qu'en C, le passage se fait par copie. Il faut donc un pointeur sur le pointeur.
Ce qui donnerait :
void detruit(t_list *l)
{
    t_list l2;
    while (*l!= NULL){
        l2 = *l ;
        *l=(*l)->suiv;
        free(l2);
        l2 = NULL;
    }
}

Et l'appel :
detruit(&l);

Cdlt
0
Ok merci !
0