Pourquoi la valeur de la variable locale existe-t-elle quand le contrôle sort de la fonction

#include int *sample(); int main(void) { int *p; p=sample(); printf("%d",*p); return 0; } int *sample() { int *p,x=10; p=&x; return p; } 

Dans le code ci-dessus, x est une variable locale. Quand j’ai compilé ci-dessus avec gcc, j’obtiens une sortie:

dix

Une variable locale n’est vivante que dans la fonction où elle est déclarée et lorsque la commande sort de la fonction, la variable locale doit être désaffectée. Mais ce n’est pas le cas. Pourquoi son impression 10? Quelqu’un peut-il expliquer ce comportement?

Bien que le comportement soit officiellement indéfini dans la norme C, dans la pratique, les valeurs en mémoire restnt inchangées jusqu’à ce que quelque chose d’autre les écrase.

Plus de détails peuvent être trouvés sur Pourquoi ai-je dans mon tableau des valeurs que je n’ai pas assignées?

J’ai juste modifié un peu votre programme. Voir ci-dessous.

 #include int *sample(); void donothing (); int main(void) { int *p; p=sample(); donothing(); printf("in main(), *p = %d\n",*p); return 0; } int *sample() { int *p,x=10; p=&x; return p; } void donothing () { int x[10], y; y = 17; return; } 

Quand je le lance maintenant, voici ce que je reçois …

 amrith@amrith-vbox:~/so$ ./stack in main(), *p = 17 amrith@amrith-vbox:~/so$ 

Il n’est jamais prudent de renvoyer l’adresse d’une variable locale car elle est généralement établie sur la stack et peut être remplacée.

Le programme a un comportement indéfini. Le renvoi d’une référence d’une variable locale a un comportement imprévisible et vous avez été malchanceux de constater que la valeur était toujours présente.

Il n’y a pas de collecte de déchets en C.

x , une variable locale, cesse d’exister à sample sortie de l’ sample

Votre cas est un comportement indéfini.