Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
Pour les besoins de mon application, je cree ensuite un tableau de liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct Element_ { int map; char val[4]; struct Element_ * suivant; }Element;
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Element * tab = (Element*)malloc(sizeof(Element)*76);
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.
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 liberer(&tab[0]);
J'espere avoir fourni toutes les informations nécessaires. Quelqu'un aurait-il une solution à mon problème?
Merci
Partager