bonjour tout le monde,
j'ai une calculatrice à faire avec lex/yacc, pas très dur en soi mais j'ai un gros problème de C que je ne comprend pas. Ca porte sur la mémoire comme d'habitude, je ne comprends pas pourquoi j'ai une erreur de segmentation, je vous montre :
mes déclarations :
et ma fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include<unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct symb { char* nom; double val; struct symb* suiv; } symb;
Ce que je ne comprends pas c'est que cette fonction réussi 2 fois, et à la troisième me met une erreur de segmentation à cet endroit là "q->nom = (char*) malloc (sizeof(char) * (strlen(nom)+1));", car il affiche le premier printf mais pas le deuxième. Pourtant q a bien été alloué à la ligne précédente !!
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 symb* affecter_variable(symb* table,char* nom, double val) { symb* q; q = (symb*) malloc (sizeof(struct symb)); printf("%s : nouveau mot\n",nom); q->nom = (char*) malloc (sizeof(char) * (strlen(nom)+1)); printf("malloc mot réussi\n"); strcpy(q->nom,nom); q->val = val; q->suiv = table; table = q; return table; }
J'ai essayé de le lancer avec le logiciel VALGRIND (logiciel de détection d'erreur mémoire), il me dit dès le premier mot qu'il y a une erreur de mémoire quand il fait strcpy (je copie colle l'erreur
Voilà je crois que je n'ai rien oubié dans ce post, si quelqu'un à une idée d'où ça peut venir ça m'intéresse !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ==4429== Use of uninitialised value of size 4 ==4429== at 0x4025C2B: strcpy (mc_replace_strmem.c:303) ==4429== by 0x804927E: yylex (in /home/ticroch2/Bureau/projet/a.out) ==4429== by 0x8048B57: yyparse (in /home/ticroch2/Bureau/projet/a.out) ==4429== by 0x804A8F1: main (in /home/ticroch2/Bureau/projet/a.out) ==4429== ==4429== Invalid write of size 1 ==4429== at 0x4025C2B: strcpy (mc_replace_strmem.c:303) ==4429== by 0x804927E: yylex (in /home/ticroch2/Bureau/projet/a.out) ==4429== by 0x8048B57: yyparse (in /home/ticroch2/Bureau/projet/a.out) ==4429== by 0x804A8F1: main (in /home/ticroch2/Bureau/projet/a.out) ==4429== Address 0x0 is not stack'd, malloc'd or (recently) free'd
Merci d'avance
Partager