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 :

arbre en C et segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut arbre en C et segmentation fault
    Bonjour,
    je cherche à coder un arbre en C avec des valeurs entières. Mon but est de pouvoir parcourir chaque branche de l'arbre (n-uplets d'entiers où n est la profondeur de la branche).

    J'ai codé la chose suivante, qui semble marcher pour la première branche, mais me renvoit un segmentation fault lors de la construction de la deuxième branche.

    J'ai pris une profondeur de 5 et les deux quintuplets suivants :
    { 7 2 3 4 5 }
    et
    { 7 3 2 4 5 }
    Mes deux branches se séparent donc au deuxième niveau de récursion et c'est là que la bât blesse.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct node {
      struct node *sn;
      int v;
      size_t s_sn;
    } n_t;
     
    int add_branch(int* branch, size_t s_branch, n_t** tree, size_t *s_tree) {
     
      int i=0;
      int* p=branch;
      size_t s_p=s_branch;
      n_t* new_tree;
      fprintf(stderr,"s_tree : %d\n",*s_tree);
     
      while (i < *s_tree && tree[i]->v!=*branch) { i++; }
     
      if (i==(*s_tree)) { /* ajout d un noeud */
        fprintf(stderr,"nouvelle val %d au niveau %d\n",*branch,s_branch);
        (*s_tree)++;
        fprintf(stderr,"allocating sizeof(n_t)*%d\n",*s_tree);
        if ( ( new_tree=realloc(*tree,sizeof(n_t)*(*s_tree) )) == NULL ) {
          fprintf(stderr,"error... could not realloc...\n");
          exit(1);
        }
        else {
          *tree=new_tree;
          tree[i]->sn=NULL;
          tree[i]->s_sn=0;
          tree[i]->v=*branch;
        }
      }
      else {
        fprintf(stderr,"val %d deja trouvee au niveau %d\n",*branch,s_branch);
      }
     
      // recursivite
      s_p--;
      if ( s_p > 0) {
        p++;
        add_branch(p,s_p,&(tree[i]->sn),&(tree[i]->s_sn));
      }
     
      return 0;
     
    }
     
    int main(int argc, char* argv[]) {
     
    n_t* t=NULL;
    size_t s_t=0;
    int b[5]={7,2,3,4,5};
     
    fprintf(stderr,"ajout de :");
    for (int i=0 ; i< sizeof(b)/sizeof(int) ; i++)
      fprintf(stderr," %d",b[i]);
    fprintf(stderr,"\n");
     
    add_branch(b,sizeof(b)/sizeof(int),&t,&s_t);
     
    b[2]=2;b[1]=3; /* 1 3 2 4 5 */
     
    fprintf(stderr,"ajout de :");
    for (int i=0 ; i< sizeof(b)/sizeof(int) ; i++)
      fprintf(stderr," %d",b[i]);
    fprintf(stderr,"\n");
     
    add_branch(b,sizeof(b)/sizeof(int),&t,&s_t);
     
    }
    Merci de votre aide, et pardon d'avance si le sujet a déjà été traité ou si c'est moi qui ai maltraité mon code...
    J'ai tenté avec gdb, mais ça ne m'a pas avancé (je ne sais pas très bien l'utiliser, j'ai fait quelques breakpoints et affiché tree, mais bof)
    L'erreur survient lorsque j'initialise le membre sn de tree[1] à NULL : tree[i]->sn=NULL. En fait tree[1] semble ne pas pointer vers un n_t, malgré mon realloc

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,
    Ligne 30, on a *tree qui reçoit une allocation d'un tableau de n_t.
    Donc pour accéder à un élément de ce tableau on doit faire (*tree)[i] qui est de type n_t.
    Et ligne 31 on accède à un champ de cet élément par (*tree)[i].sn = NULL;.
    tree est un pointeur et tree[1] ne correspond pas à une adresse valide.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Super, merci, voici mon code qui marche :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct node {
      struct node *sn;
      int v;
      size_t s_sn;
    } n_t;
     
    int add_branch(int* branch, size_t s_branch, n_t** tree, size_t *s_tree) {
     
      int i=0;
      int* p=branch;
      size_t s_p=s_branch;
      n_t* new_tree;
      //fprintf(stderr,"s_tree : %d\n",*s_tree);
     
      while (i < *s_tree && (*tree)[i].v!=*branch) { i++; }
     
      if (i==(*s_tree)) { /* ajout d un noeud */
        fprintf(stderr,"nouvelle val %d au niveau %d\n",*branch,s_branch);
        (*s_tree)++;
        fprintf(stderr,"allocating sizeof(n_t)*%d\n",*s_tree);
        if ( ( new_tree=realloc(*tree,sizeof(n_t)*(*s_tree) )) == NULL ) {
          fprintf(stderr,"error... could not realloc...\n");
          exit(1);
        }
        else {
          *tree=new_tree;
          (*tree)[i].sn=NULL;
          (*tree)[i].s_sn=0;
          (*tree)[i].v=*branch;
        }
      }
      else {
        fprintf(stderr,"val %d deja trouvee au niveau %d\n",*branch,s_branch);
      }
     
      // recursivite
      s_p--;
      if ( s_p > 0) {
        p++;
        fprintf(stderr,"recursion profondeur %d\n",s_p);
        add_branch(p,s_p,&((*tree)[i].sn),&((*tree)[i].s_sn));
      }
     
      return 0;
     
    }
     
    int main(int argc, char* argv[]) {
     
    n_t* t=NULL;
    size_t s_t=0;
    int b[5]={7,2,3,4,5};
     
    fprintf(stderr,"ajout de :");
    for (int i=0 ; i< sizeof(b)/sizeof(int) ; i++)
      fprintf(stderr," %d",b[i]);
    fprintf(stderr,"\n");
    add_branch(b,sizeof(b)/sizeof(int),&t,&s_t);
     
    b[2]=2;b[1]=3; /* 1 3 2 4 5 */
    fprintf(stderr,"ajout de :");
    for (int i=0 ; i< sizeof(b)/sizeof(int) ; i++)
      fprintf(stderr," %d",b[i]);
    fprintf(stderr,"\n");
    add_branch(b,sizeof(b)/sizeof(int),&t,&s_t);
     
    }
    avec des fuites de mémoire forcément puisque je n'ai pas encore écrit le code pour la libérer.
    Merci !

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

Discussions similaires

  1. Arbre binaire de recherche - insertion - segmentation fault
    Par programmation_ dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2013, 14h41
  2. dictionnaire en arbre et segmentation fault
    Par karlakir dans le forum C
    Réponses: 4
    Dernier message: 31/05/2009, 19h09
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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