0
votes

Segment de pile c

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.

en surbrillance duplicate possible expliquée pourquoi la matrice a échoué sur le retour, c'est-à-dire que le pointeur à l'élément 0 renvoyé n'est plus valide mais n'a pas montré que les variables de la même classe de stockage (Auto) sont correctes. Valeur qui survit à l'élimination du cadre de pile forte> p>

"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; 
} 

c

2 commentaires

Parce que dans les autres cas, la valeur elle-même est renvoyée. S'ils aussi, retournèrent un Pointeur à la variable locale, la même chose serait vraie.


Dupliqué possible de Erreur: la fonction renvoie l'adresse de la variable locale


3 Réponses :


4
votes

La différence consiste à renvoyer une valeur par opposition à la retournement d'un pointeur.

Lorsque vous faites ceci: xxx

ceci est valide parce que même si x est hors de portée lorsque f retourne, c'est la valeur stockée dans x (9 dans ce cas) qui est renvoyé. Cette valeur est ensuite affectée à A et ensuite imprimé.

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, retour str est identique à retour & str [0] . Cette valeur de pointeur est renvoyée et transmise à printf . Alors printf a essayé de désirer le pointeur, mais la mémoire qu'il pointe de (le tableau str ) n'est plus valide.

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.


0 commentaires

5
votes

Cela devrait expliquer grossièrement ce qui s'est passé, après le retour de GetString (), sa pile n'est plus valide. XXX

Si compilé avec GCC -W -Wall (doit toujours utiliser ces options) , il devrait donner l'avertissement: xxx


3 commentaires

Est une constante de chaîne comme "x" 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!



0
votes

Il y a 2 situations:

  1. Lorsque vous retournez une valeur simple comme un int ou char à 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 en fait copié .

  2. Vous avez maintenant la chaîne "gfg" dans str et lorsque vous faites retour str , la valeur qui est copiée est ce que est-il dans str 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).


0 commentaires