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 :

Problème de libération


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème de libération
    Bonjour,

    Voila j'ai depuis un petit moment un problème que je ne comprend pas lorsque je libère un arbre qui ne contient que la racine. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void liberation (arbre *a)
    {
        if (est_feuille (*a))
        {
            free (*a); 
            *a = NULL;
        }
        else
        {
            liberation (&(*a)->gauche);
            liberation (&(*a)->droite);
            free (*a); 
            *a = NULL;
        }
     
        return ;
    }
    Merci d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le code n'est pas net : j'aurai remplacé les '*a' par 'a' (sauf dans le prototype) ; mais sans en savoir plus sur a, c'est dur d'être catégorique.

    • Quel est le problème ? Un crash, une compilation impossible ? ...
    • À quoi ressemble le type arbre ?
    • Peux tu fournir un code qui compile (ou au moins reproduit le problème) ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Le code n'est pas net : j'aurai remplacé les '*a' par 'a' (sauf dans le prototype) ; mais sans en savoir plus sur a, c'est dur d'être catégorique.
    a mon avis tu peux l'être, tous les *a du code de la procédure sont a enlever

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Le but de la fonction est de libérer chaque noeud et de les mettre à NULL, et sans passer un pointeur ceci n'est je pense pas possible.

    Citation Envoyé par mabu Voir le message
    • Quel est le problème ? Un crash, une compilation impossible ? ...
    Un crash
    Citation Envoyé par mabu Voir le message
    • À quoi ressemble le type arbre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct arbre
    {
            char byte; 
            struct arbre *gauche; 
            struct arbre *droite;
    } *arbre;
    Citation Envoyé par mabu Voir le message
    • Peux tu fournir un code qui compile (ou au moins reproduit le problème) ?
    Ceci je pense devrait provoquer l'erreur rencontré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct arbre
    {
            char byte;
            struct arbre *gauche;
            struct arbre *droite;
    } *arbre;
     
    void liberation (arbre *a);
     
    int main (void)
    {
        arbre a;
     
        a->byte = 'z';
        a->gauche = NULL;
        a->droite = NULL;
        liberation (&a);
     
        return 0;
    }
     
    void liberation (arbre *a)
    {
        if (!((*a)->gauche || (*a)->droite))
        {
            free (*a);
            *a = NULL;
        }
        else
        {
            liberation (&(*a)->gauche);
            liberation (&(*a)->droite);
            free (*a);
            *a = NULL;
        }
     
        return ;
    }

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le seul problème éventuel que je vois est le cas où *a est NULL, (l'arbre est vide). Tout dépend de la réponse dans ce cas de est_feuille() (qui devrait ne pas planter et répondre alors VRAI). Ton code correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void liberation (arbre *a)
    {
        if ( ! est_feuille (*a))
        {
            liberation (&(*a)->gauche);
            liberation (&(*a)->droite);
         }
         free (*a); 
         *a = NULL;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    rien à voir avec la libération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        arbre a;
     
        a->byte = 'z';
        a->gauche = NULL;
    crée un pointeur a non initialisé . Plante dès a->byte=...
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Alors, dans ton exemple, tu écris
    Or arbre cache un pointeur : donc tu ne fait que créer un pointeur, il n'y a aucune mémoire allouée.

    Pour allouer la mémoire de ton arbre, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main (void)
    {
        arbre a;
        
        a = malloc(sizeof *a);
     
        a->byte = 'z';
        a->gauche = NULL;
        a->droite = NULL;
        liberation (&a);
     
        return 0;
    }
    EDIT : Pour la libération, il y a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void liberation (arbre *a)
    {
        if((*a)->gauche != NULL) {
            liberation (&(*a)->gauche);
        }
        if((*a)->droite != NULL) {
            liberation (&(*a)->droite);
        }
        free (*a);
        *a = NULL;
     
        return ;
    }

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    En effet oui l'exemple que j'ai donné ne marchais pas, j'ai écris ça un peut à la va vite sans faire vraiment attention désolé.

    Sinon mabu ton code était bien la solution que j'attendais Merci beaucoup à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/04/2006, 10h01
  2. Problème de libération de tableau dynamique
    Par cali1983 dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 08h30
  3. Problèmes de libération de Dll en delphi7 sous windows XP
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2006, 15h30
  4. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

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