2015-11-19 1 views
0

Dans ce programme, lorsque p() est appelée pour la première fois, elle imprime 0 (je me rends compte qu'elle peut simplement imprimer des données parasites sur certains systèmes).La variable locale dans la fonction conserve sa valeur lorsque la fonction est appelée à nouveau

Mais la deuxième fois que p() est appelée, elle imprime 2 même si y est à nouveau déclaré. Il semble conserver la valeur y lorsque p() a été appelée pour la première fois.

Je suis très confus quant à pourquoi. Quelqu'un peut-il aider à expliquer? Et aussi comment je peux modifier la fonction principale pour le faire ne pas le faire?

void p() 
{ 
int y; 
printf ("%d ", y); 
y = 2; 
} 
void main() 
{ 
p(); 
p(); 
} 
+3

Vous imprimez une variable non initialisée. C'est un comportement indéfini et vous ne pouvez pas vous attendre à un résultat particulier. Quelques lectures pour vous: [comportement indéfini, non spécifié et implémenté] (https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior) et [Est-ce que "Undefined Behavior" permet vraiment * quoi que ce soit * à se produire?] (https://stackoverflow.com/questions/32132574/does-undefined-behavior-really-permit-anything-to-happen) – kaylum

+0

On ne sait pas exactement ce que vous voulez réellement faire. Réglez juste 'y' pour avoir la valeur que vous voulez avant de l'imprimer. Et la dernière instruction dans 'p' est inutile car' y' est une variable locale et ainsi la fixer n'a de sens que si elle doit être utilisée plus tard dans cette même fonction. – kaylum

+0

C'est quelque chose que vous devriez ignorer, ne vous inquiétez pas. Si vous appelez la même fonction dos-à-dos, alors il y a de fortes chances qu'elle récupère l'ancienne valeur, puisqu'elle sera recherchée au même endroit. Mais vous ne pouvez pas compter sur cela. –

Répondre

0

La plus grande partie du compilateur C stocke la variable locale dans la pile. vous codez le comportement est comme suit.

-> première fois appel p()

1. **int y;** push y in top of stack. (here value y is 0 or garbage according to compiler because it take value of is memory location). 
2. **printf ("%d ", y);** print value of y location. 
3. **y = 2;** change value of y location with 2. 
4. end of function scope of y finish (i assume you know a variable scope in c) and pop from stack but not reset value of that location. 

-> deuxième appel de temps p()

1. **int y;** push y in top of stack (memory location allocated of variable y is same as first call p() memory allocation of y so that here value y is 2 because in first call we set value 2 in this location) 
2. **printf ("%d ", y);** print value of y location. 

pourquoi ici 2 c'est en impression dans le deuxième appel p(). Pour votre référence, voir le code suivant, i valeur d'impression et l'adresse de la mémoire de la variable dans ce code.

vide p()

{

int y;

printf ("valeur de y =% d \ n", y);

printf ("adresse de y =% p \ n", & y);

y = 2;

}

q void() {

int x;

printf ("valeur de x =% d \ n", x);

printf ("adresse de x =% p \ n", & x);

x = 8;

}

void main()

{

p();

q();

p();

}

+0

C'est parfait! Je savais un peu ce qui se passait mais ce post le rendait si clair et concis. Je vous remercie! –

0

http://en.cppreference.com/w/c/language/storage_duration#Storage_duration

La meilleure façon est de changer la durée de stockage ou votre variable. Mais l'alternative consiste à utiliser le paramètre de fonction et la valeur de retour pour transférer les informations d'état. La durée de stockage statique peut être problématique dans les programmes multithread, ce qui rend la solution alternative souvent plus attrayante.

EDIT: Droite. J'ai lu et compris la question complètement à l'opposé de ce qui était demandé. Le commentaire sur les valeurs non initialisées est la réponse correcte. Cela signifie que, sans initialisation, la variable a une valeur aléatoire qui a été laissée par une opération précédente aléatoire. Dans ce cas, cette valeur aléatoire est la même que celle de l'appel précédent à la même fonction.

+0

Ohhhh ce message l'a éclairci. Je n'ai pas pensé à la valeur aléatoire étant au même endroit les deux fois. Et puisque cette adresse de mémoire est changée à la fin du premier appel de fonction, alors elle change la valeur aléatoire dans le second appel de fonction. –