Je suis tombé sur un exemple dans une page décrivant les différentes manières de représenter une chaîne en structures C. Il explique qu'un tableau défini dans une fonction extérieure principale sera stocké dans le segment de pile et, en tant que tel, ne sera pas nécessairement présent à la suite de son rendement susceptible de provoquer une erreur d'exécution.
"Le programme ci-dessous peut imprimer des données de déchets lorsque la chaîne est stockée dans le cadre de pile de la fonction godets () et les données peuvent ne pas être là après getString ( ) Retourne. " p> char *getString()
{
char str[] = "GfG"; /* Stored in stack segment */
/* Problem: string may not be present after getSting() returns */
return str;
}
int main()
{
printf("%s", getString());
getchar();
return 0;
}
3 Réponses :
La différence consiste à renvoyer une valeur par opposition à la retournement d'un pointeur.
Lorsque vous faites ceci: p> ceci est valide parce que même si Dans votre exemple, vous retournez une matrice. Dans la plupart des contextes, un tableau utilisé dans une expression se désintègre dans un pointeur à son premier élément. Donc, afin que vous puissiez retourner des valeurs À partir d'une fonction, mais si cette valeur est un pointeur sur une variable locale, il ne sera pas valide. P> p> x code> est hors de portée lorsque f code> retourne, c'est la valeur em> stockée dans x code> (9 dans ce cas) qui est renvoyé. Cette valeur est ensuite affectée à A code> et ensuite imprimé. P> retour str code> est identique à retour & str [0] code>. Cette valeur de pointeur est renvoyée et transmise à printf code>. Alors printf code> a essayé de désirer le pointeur, mais la mémoire qu'il pointe de (le tableau str code>) n'est plus valide. P>
Cela devrait expliquer grossièrement ce qui s'est passé, après le retour de GetString (), sa pile n'est plus valide. Si compilé avec GCC -W -Wall (doit toujours utiliser ces options) , il devrait donner l'avertissement: p>
Est une constante de chaîne comme "x" code> stocké dans la pile? Il pourrait être stocké quelque part dans le segment de données.
Avec ou sans const, GCC (6.3) (6.3) donne tous les mêmes "AVERTISSEMENT: la fonction renvoie l'adresse de la variable locale [-WRETURN-LOCAL-ADDR]", qui implique qu'il pourrait être stocké sur la pile aussi.
Bon sur GCC, alors!
Il y a 2 situations: p>
Lorsque vous retournez une valeur simple comme un Vous avez maintenant la chaîne int code> ou char code> à partir d'une fonction locale et cette variable est définie / déclarée dans cette fonction locale. Cela se produit avec succès, car tout en retournant la valeur est "gfg" code> dans str code> et lorsque vous faites retour str code>, la valeur qui est copiée est ce que est-il dans str code> et c'est l'emplacement de l'adresse de la matrice. Donc, dans ce cas, l'emplacement de la matrice (pointeur) est copié, tandis que le contenu de ce réseau disparaît (car le contenu était sur le cadre de pile local). P> LI>
ol>
Parce que dans les autres cas, la valeur elle-même est renvoyée. S'ils aussi, retournèrent un Pointeur i> à la variable locale, la même chose serait vraie.
Dupliqué possible de Erreur: la fonction renvoie l'adresse de la variable locale