Arbre binaire en C erreur de segmentation
Fermé
aurore18
Messages postés
10
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
1 juin 2016
-
25 nov. 2007 à 19:14
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 nov. 2007 à 15:51
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 nov. 2007 à 15:51
A voir également:
- Arbre binaire en C erreur de segmentation
- Erreur 0x80070643 - Accueil - Windows
- Codage binaire - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Erreur 38 free ✓ - Forum Mobile
8 réponses
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
25 nov. 2007 à 19:25
25 nov. 2007 à 19:25
les erreur de segmention c'est souvent des probleme allocation de memoire...
verifie tes malloc ça doit etre par la
verifie tes malloc ça doit etre par la
aurore18
Messages postés
10
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
1 juin 2016
1
25 nov. 2007 à 20:05
25 nov. 2007 à 20:05
merci jessaie mais jai vraiment du mal jai deja trouve une grosse erreur mais pas de lordre de lallocation memoire.
questiion les malloc, on doit allouer la memoire que dans le main non ?
questiion les malloc, on doit allouer la memoire que dans le main non ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 nov. 2007 à 21:23
25 nov. 2007 à 21:23
Salut,
Tu as un problème dans ta fonction stocker().
if(strcmp(root->wordvalue,mot), le problème c'est que root->wordvalue est null.
Tu as fait root=wtree, mais wtree->wordvalue est null.
Cdt
Tu as un problème dans ta fonction stocker().
if(strcmp(root->wordvalue,mot), le problème c'est que root->wordvalue est null.
Tu as fait root=wtree, mais wtree->wordvalue est null.
Cdt
Bonsoir,
Rien ne t'oblige à faire les malloc uniquement dans le main.
J'ai commencé à la ta fonction stocker et plusieurs chose m'échappent :
si l'allocation échoue (root==NULL) tu utilises le pointeur root ? Plantage assuré
si elle réussit, tu écrases immédiatement le pointeur obtenu (root=wtree)
Bon admettons que tu aies voulu écrire if (root!= NULL)
Dans ce cas, le noeud que tu crées en cas de succès de l'allocation n'est pas raccroché à ton arbre ??? de plus, la mémoire ne sera jamais désallouée
Rien ne t'oblige à faire les malloc uniquement dans le main.
J'ai commencé à la ta fonction stocker et plusieurs chose m'échappent :
si l'allocation échoue (root==NULL) tu utilises le pointeur root ? Plantage assuré
si elle réussit, tu écrases immédiatement le pointeur obtenu (root=wtree)
Bon admettons que tu aies voulu écrire if (root!= NULL)
Dans ce cas, le noeud que tu crées en cas de succès de l'allocation n'est pas raccroché à ton arbre ??? de plus, la mémoire ne sera jamais désallouée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 nov. 2007 à 22:51
25 nov. 2007 à 22:51
Salut,
Voilà, ton code corrigé, il y avait plein de petites bétises.
Il en reste encore une que j'ai pas corrigée, n'oublie pas les "free".
Cdt
Voilà, ton code corrigé, il y avait plein de petites bétises.
Il en reste encore une que j'ai pas corrigée, n'oublie pas les "free".
#include <locale.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define taille 10000 struct wordtree { /* structure d'un noeud de l'arbre*/ char *wordvalue; /* la valeur du mot*/ int wordcount; /* le compteur associé*/ struct wordtree * left; /*lien vers le fils gauche*/ struct wordtree * right ; /* lien vers le fils droit*/ }; void stocker (struct wordtree *wtree, char *mot) { int trouve=0; struct wordtree * root; if (wtree->wordvalue==NULL) { wtree->wordvalue=(char*)malloc(50); strcpy(wtree->wordvalue, mot); wtree->wordcount=1; wtree->left=NULL; wtree->right=NULL; } else { root=wtree; while (root!=NULL && trouve==0) { if(strcmp(wtree->wordvalue,mot)<0) { root=root->left;} else if (strcmp(root->wordvalue,mot)>0) {root=root->right;} else if (strcmp(root->wordvalue,mot)==0) { (root->wordcount)++; trouve=1; } } root=(struct wordtree *)malloc(sizeof(struct wordtree)); root->wordvalue=(char*)malloc(50); strcpy(root->wordvalue, mot); (root->wordcount)=1; } } void affichage (struct wordtree *wtree) { while (wtree!=NULL) { printf("%s ", wtree->wordvalue); printf("%d\n",wtree->wordcount); wtree=wtree->left; } } int main ( int argc , char ** argv ) { setlocale(LC_ALL, ""); /*pour inclure les caractère daccent etc*/ FILE * df; char car; char mot[taille]; struct wordtree *wtree=NULL; wtree=(struct wordtree *)malloc(sizeof(struct wordtree)); int i=0; if (argc!=2) {printf ("utilisation : %s fichier \n",argv[0]); exit(-1); } if ((df=fopen (argv[1],"r"))==NULL) { printf ("fichier %s non accessible \n",argv[1]); exit(-2); } while ((car=fgetc(df))!=EOF) { if (isalpha(car)) {mot[i]=car; i=i+1 ; } else {if (i>0) { /* cas des separateurs multiples*/ mot[i]='\0';/* terminaison de chaine*/ stocker (wtree,mot); /*traiter le mot*/ i=0;/*remise à zero pour mot suivant*/ }} } affichage(wtree); fclose (df); return 0; }
Cdt
aurore18
Messages postés
10
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
1 juin 2016
1
26 nov. 2007 à 12:01
26 nov. 2007 à 12:01
merci beaucoup je comprend mieux maintenant, je m'etais embrouillé avec le root ...
aurore18
Messages postés
10
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
1 juin 2016
1
26 nov. 2007 à 13:21
26 nov. 2007 à 13:21
en fait je comprends pas bien les malloc, pourquoi faut til faire un malloc pour la structure en entier puis aussi un pour le wordvalue
root=(struct wordtree *)malloc(sizeof(struct wordtree));
root->wordvalue=(char*)malloc(50);
je sais pas, le fait d'allouer de la memoire pour la structure en entier ne sousentend pas la place pour le wordvalue ?
root=(struct wordtree *)malloc(sizeof(struct wordtree));
root->wordvalue=(char*)malloc(50);
je sais pas, le fait d'allouer de la memoire pour la structure en entier ne sousentend pas la place pour le wordvalue ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
26 nov. 2007 à 15:51
26 nov. 2007 à 15:51
Salut,
Non, le fait d'allouer de la mémoire pour la structure en entier ne donne pas d'allocation pour le wordvalue. On peut prendre l'exemple d'une armoire. On dit que l'armoire prend tant de place, mais ça ne donne pas la dimension des étagères. Dès que tu as un char *, tu dois l'allouer, à mois de l'initialiser à la déclaration.
N'hésite à reposer des questions, et n'oublie pas non plus les free() ;)
Cdt
Non, le fait d'allouer de la mémoire pour la structure en entier ne donne pas d'allocation pour le wordvalue. On peut prendre l'exemple d'une armoire. On dit que l'armoire prend tant de place, mais ça ne donne pas la dimension des étagères. Dès que tu as un char *, tu dois l'allouer, à mois de l'initialiser à la déclaration.
N'hésite à reposer des questions, et n'oublie pas non plus les free() ;)
Cdt