Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
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;
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
 
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.

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;
}
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