IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Libérer tableau de liste


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 25
    Points
    25
    Par défaut Libérer tableau de liste
    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

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kenikun Voir le message
    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
    Je sens comme de la confusion, surtout quand je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Element * tab = (Element*)malloc(sizeof(Element)*76);
    Les élements de la liste chainée sont pris dans ce tableau ? Ils ne sont donc pas alloués individuellement. Pour libérer la liste, il suffit de libérer le tableau (1 malloc(), 1 free() aussi simple que ça). Remettre aussitôt tous les pointeurs 'aliasés' encore actifs à NULL.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [C# .NET2] tableau de List<T>
    Par gdkenny dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/04/2006, 10h10
  2. Réponses: 3
    Dernier message: 24/04/2006, 20h56
  3. [Tableaux] tableau vers liste deroulane
    Par flydragon dans le forum Langage
    Réponses: 5
    Dernier message: 12/04/2006, 17h11
  4. Pb tableau de listes chainées
    Par Beush dans le forum C
    Réponses: 4
    Dernier message: 24/11/2005, 16h43
  5. declaration d'un tableau de listes
    Par flah06 dans le forum C++
    Réponses: 1
    Dernier message: 15/11/2005, 19h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo