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 :

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;
et ma fonction
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;
}
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 !!

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

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
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 !!

Merci d'avance