adresse de retour de la variable locale

Dupliquer possible:
Peut-on accéder à la mémoire d’une variable locale en dehors de sa scope?

J’essaie de comprendre pourquoi j’obtiens cette sortie pour le programme ci-dessous

[hello] [0xbfde68f4] [world] [0xbfde68f4] [world] [0xbfde68f4] 

Le programme est

 int main(void) { char **ptr1 = NULL; char **ptr2 = NULL; ptr1 = func1(); ptr2 = func2(); printf(" [%s] [%p]\n",*ptr1, (void*)ptr1); printf(" [%s] [%p]\n",*ptr2, (void*)ptr2); printf(" [%s] [%p]\n",*ptr1, (void*)ptr1); return 0; } char** func1() { char *p = "hello"; return &p; } char** func2() { char *p = "world"; return &p; } 

Je comprends que ce n’est pas une bonne pratique de renvoyer l’adresse des variables locales mais c’est juste une expérience.

L’adresse mémoire est réutilisée. D’abord, il détient l’adresse de la possession constante “hello”, puis il est réutilisé pour contenir l’adresse de la possession constante “monde”.

Une fois que la mémoire n’est plus utilisée, elle est disponible pour une réutilisation. Il est généralement plus efficace de réutiliser la mémoire la plus récemment utilisée, c’est donc ce que les compilateurs et les gestionnaires de mémoire tentent généralement de faire.

Notez que ce n’est certainement pas garanti. Vous constaterez peut-être que ce programme plante ou donne des adresses différentes sur différents compilateurs ou plateformes. Cependant, la réutilisation est très, très probable dans ce scénario particulier, car les deux variables sont locales et affectées sur la stack et qu’aucun code intermédiaire n’utilise un espace de stack. Si vous ajoutez une utilisation intermédiaire de l’espace de stack, vous obtiendrez un comportement différent.

Les variables locales résident sur la stack. Lorsque vous avez appelé func1 (), la variable locale a été créée, puis détruite car elle était hors de scope. func2 () utilisait le même espace pour sa variable locale, car func1 () ne l’utilisait plus.

ptr1 = func1(); utilisez le bloc de mémoire comme ci-dessous.

 prt1 ↓ [h][e][l][l][o][\0] ↑ 0xbfde68f4 

ptr2 = func2(); utilisez le même bloc de mémoire car après avoir quitté func1, ce bloc de mémoire peut être réutilisé.

  prt2 ↓ prt1→[w][o][r][l][d][\0] ↑ 0xbfde68f4