Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
[code]
typedef struct Element_
{
int map;
char val[4];
struct Element_ * suivant;
}Element;
[/code]
Pour les besoins de mon application, je cree ensuite un tableau de liste.
[code]
Element * tab = (Element*)malloc(sizeof(Element)*76);
[/code]
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 76: 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 vais 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 là 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