Maison  >  Article  >  développement back-end  >  Qu'arrive-t-il à la mémoire variable une fois sa portée terminée : écrasée immédiatement ou réservée jusqu'à la fin de la fonction ?

Qu'arrive-t-il à la mémoire variable une fois sa portée terminée : écrasée immédiatement ou réservée jusqu'à la fin de la fonction ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-18 03:57:02465parcourir

What Happens to Variable Memory After Its Scope Ends: Overwritten Immediately or Reserved Until Function Conclusion?

Portée et durée de vie des variables : une énigme

Lorsqu'une variable est déclarée dans un bloc de code, sa portée définit les parties du code où elle est accessible . Mais qu’arrive-t-il à la mémoire allouée à la variable lorsque sa portée prend fin ? Est-il écrasé immédiatement, ou reste-t-il réservé jusqu'à la fin de la fonction dans laquelle il réside ?

Cette question découle de l'extrait de code suivant :

foo() {
  int *p;
  {
    int x = 5; 
    p = &x;
  }
  int y = *p;  // undefined behavior
}

Si la mémoire de la variable x est toujours alloué après avoir été hors de portée, le pointeur p continuera à pointer vers le bon emplacement, nous permettant d'accéder à la valeur de x même s'il n'est plus dans scope.

Pour résoudre cette énigme, nous devons nous plonger dans les concepts de scope et de durée de vie.

Scope

Scope englobe les sections de code où une variable est accessible. Lorsqu'une variable est déclarée entre accolades ({}), sa portée est limitée au bloc de code inclus.

Durée de vie

Durée de vie englobe la durée pendant laquelle une variable ou l'objet existe dans un état valide. Pour les variables automatiques ou locales non statiques, leur durée de vie est limitée à leur portée. En d'autres termes, ces variables sont automatiquement détruites une fois leur portée terminée.

Comportement non défini dans l'extrait de code

Dans l'extrait de code donné, la variable x est déclarée comme variable locale non statique , ce qui signifie que sa durée de vie est liée à sa portée. Lorsque la portée interne se termine, x cesse d'exister, laissant le pointeur p pointant vers un emplacement qui n'est plus valide.

Par conséquent, tenter d'accéder à la valeur de x via p est un comportement indéfini. Le compilateur peut ou non allouer de la mémoire à x au-delà de sa portée, conduisant à des résultats imprévisibles. Il est donc crucial d'éviter d'accéder à des variables dont la portée est terminée.

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