Desallouer tableau de liste

Résolu/Fermé
kenikun - 18 mai 2008 à 17:19
 kenikun - 18 mai 2008 à 22:29
Bonjour,
Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :

typedef struct Element_
{
int map;
char val[4];
struct Element_ * suivant;
}Element;

Pour les besoins de mon application, je cree ensuite un tableau de liste.

Element * tab = (Element*)malloc(sizeof(Element)*76);

Le tableau est initialisé avec tous les map à 0, val à "" et suivant à NULL. Ensuite je remplis le tableau. Par exemple je peux avoir quelque chose du genre:

Case 0: val="abc\0" map=1 , suivant=NULL
.....
...
case 75: val="etc\0" map=5, suivant:val="epu\0" map=1, suivant=NULL

Mon programme fonctionne correctement et fait bien ce que je veux. Mais je rencontre un probleme lorsque je veux liberer l'espace alloué pour le tableau de liste. J'ai pensé à faire une fonction qui permet de liberer une case et ensuite faire une boucle pour liberer toutes les autres.

int liberer(Element* p)
{
Element *tmp;
while(p)
{
tmp=p->suivant;
free(p);
p=tmp;
}
return 0;
}
Vu que je veux faire une modification, je passe en parametre un pointeur sur la case et j'appelle la fonction avec l'adresse de la case. Par exemple : liberer(&tab[0]);
Jusque tout va bien (enfin pour la premiere case), mais dès que je veux passer à la case suivante, j'ai un SIGSEGV. J'ai regardé dans le debogueur et j'ai cette information : ***glibc detected *** /home/seb/appli/debug/src/appli: free(): invalid pointer: 0x0805e5e4 (c'est l'adresse de la case 1 apres avoir liberé la case 0).


Quelqu'un aurait-il une solution à mon problème?
Merci
A voir également:

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
18 mai 2008 à 18:10
Salut,

vu la déclaration de ta structure il n'y pas d'allocation dynamique pour un élément, donc tu n'as rien à libérer

dans ton cas il s'agit de libérer la mémoire pour un tableau alloué dynamiquement

free(tab); est suffisant
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
18 mai 2008 à 18:15
En revanche tu auras peut être besoin de détruire la liste.
Chaque élément de ton tableau est la tête d'une liste

Regarde ici pour la destruction d'une liste

Bref, d'abord tu détruit les listes et à la fin tu fait un free(tab)
0
merci, ça marche bcp mieux
0