Bonjour,
Aujourd'hui, en tp de structure de données (C), nous avons été confronté à un petit problème auquel même le prof ne comprend pas exactement ce qui ne va pas.
théoriquement en faisant fonction.mot ou fonction.definition, on accède au mot/définition du Noeud mon_noeud.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 typedef struct { char mot[26]; char definition[26]; }Noeud; Noeud fonction(....) { Noeud mon_noeud; //traitement... return mon_noeud; }
Mais si on fait :
on a SEGFAULT,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 printf("%s", fonction().mot);
si on fait :
On a une erreur de lvalue (je ne me souvient pas exactement de l'erreur).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 strcmp(fonction().mot, "blabla");
Alors que si on passe par une variable intermédiaire
Tout ce passe bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Noeud tmp = fonction(); printf("%s\n", tmp); strcmp(tmp, "blabla");
Est-ce que cela pourrait venir du fait que Noeud soit composé d'une chaîne de caractère?
Mais comme les chaîne de caractères sont déclarées comme des tableaux fixes, théoriquement, ils sont stocké au sein même de la structure Noeud.
Ce n'est donc pas un pointeur contenu dans Noeud qui pointerais vers un tableau extérieur, donc tant que le Noeud n'est pas désalloué, les deux chaînes de caractères ne le sont pas non plus.
Peut être que le pointeur (mot) de tmp (pointant sur mot[0]) est "mis à jour" lors de l'affectation.
Lorsqu'on utilise fonction().nom, on utilise un pointeur qui pointe sur le mot[0] local de la fonction.
Or comme on a déjà quitté la fonction, le mon_noeud est désalloué.
Le pointeur mot de la valeur de retour de fonction pointerais donc sur mot[0] de mon_noeud?
Qu'en pensez-vous?
Partager