Desallouer tableau de liste
Résolu
kenikun
-
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
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:
- Desallouer tableau de liste
- Liste déroulante excel - Guide
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
3 réponses
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
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
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)
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)