fonction retournant une structure.
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.
Code:
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;
} |
théoriquement en faisant fonction.mot ou fonction.definition, on accède au mot/définition du Noeud mon_noeud.
Mais si on fait :
Code:
1 2
|
printf("%s", fonction().mot); |
on a SEGFAULT,
si on fait :
Code:
1 2
|
strcmp(fonction().mot, "blabla"); |
On a une erreur de lvalue (je ne me souvient pas exactement de l'erreur).
Alors que si on passe par une variable intermédiaire
Code:
1 2 3 4
|
Noeud tmp = fonction();
printf("%s\n", tmp);
strcmp(tmp, "blabla"); |
Tout ce passe bien.
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?