Desallouer tableau de liste

Résolu
kenikun -  
 kenikun -
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
kenikun
 
merci, ça marche bcp mieux
0