[Langage C] un free qui ne libère rien
marmotte
-
marmotte -
marmotte -
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.
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:
- [Langage C] un free qui ne libère rien
- Word 2013 free download - Télécharger - Traitement de texte
- Zimbra free - Guide
- Free office - Télécharger - Suite bureautique
- Sketchup free - Télécharger - 3D
- Bitdefender free - Télécharger - Antivirus & Antimalwares
1 réponse
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 :
Et l'appel :
Cdlt
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
marmotte
Ok merci !