Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
1 2 3 4 5 6 7
|
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.
1 2
|
Element * tab = (Element*)malloc(sizeof(Element)*76); |
Le tableau est ensuite 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 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.
1 2 3 4 5 6 7 8 9 10 11 12
|
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. Lorsque je fais :
La premiere case est bien libérée, mais lorsque 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).
J'espere avoir fourni toutes les informations nécessaires. Quelqu'un aurait-il une solution à mon problème?
Merci
Partager