Maison >développement back-end >C++ >Pourquoi est-il parfois possible de renvoyer une référence à une variable locale en C ?

Pourquoi est-il parfois possible de renvoyer une référence à une variable locale en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 03:20:09185parcourir

Why is Returning a Reference to a Local Variable in C   Sometimes Possible?

Renvoi de valeurs à partir de variables locales : un comportement surprenant

En programmation, les variables locales sont généralement stockées dans la mémoire de la pile. Lorsqu'une fonction est renvoyée, le cadre de pile associé est supprimé et les variables qu'il contient ne sont plus accessibles. Cependant, un comportement particulier se produit lorsque l'on tente de renvoyer une référence à une variable locale.

Comme le démontre l'extrait de code fourni :

int& foo() {
    int i = 6;
    return i;
}

int main() {
    int i = foo();
    std::cout << i << std::endl;
    std::cout << &i << std::endl;
}

Ce code semble contredire les règles habituelles de la pile gestion de la mémoire. Malgré le fait que la variable locale i dans la fonction foo soit supprimée de la pile au retour de la fonction, la valeur référencée reste accessible dans la fonction principale.

Ce comportement inhabituel est dû à une bizarrerie dans la manière la plus les compilateurs implémentent des appels de fonction. Lorsqu'une fonction est appelée, le compilateur réserve un bloc mémoire sur la pile pour les variables et paramètres locaux de la fonction. Pendant l'exécution de la fonction, la mémoire allouée sur la pile est protégée, empêchant d'autres fonctions d'y accéder. Cependant, lorsque la fonction revient, la protection de la mémoire n'est pas immédiatement supprimée. Au lieu de cela, le compilateur attend le prochain appel de fonction ou jusqu'à ce que le cadre de pile actuel ne soit plus nécessaire.

Dans le cas de la fonction foo, le compilateur alloue de la mémoire pour la variable locale i sur la pile. Lorsque la fonction revient, la valeur de retour de i est placée à l'emplacement réservé au prochain appel de fonction ou au cadre de pile de l'appelant. Cela signifie que même si le cadre de pile pour foo a été supprimé, la mémoire allouée à la variable locale i reste intacte et accessible via la référence renvoyée.

Il est important de noter que ce comportement dépend du compilateur et de l'implémentation. . Certains compilateurs peuvent choisir de supprimer la protection de la mémoire immédiatement après le retour de la fonction, ce qui rend l'accès à l'emplacement mémoire d'une variable locale après avoir renvoyé un comportement indéfini. Par conséquent, le renvoi de références à des variables locales doit être évité en général et est considéré comme une pratique de codage dangereuse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn