Maison  >  Article  >  développement back-end  >  Pourquoi la modification d'une constante via un pointeur non const produit-elle un comportement indéfini ?

Pourquoi la modification d'une constante via un pointeur non const produit-elle un comportement indéfini ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 05:31:02816parcourir

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

Modification d'une constante via un pointeur non const : plongée dans un comportement non défini

Dans l'extrait de code fourni, vous exprimez une confusion sur le comportement de modifier un entier constant (e) via un pointeur non const (w) :

<code class="cpp">const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w</code>

Après avoir effectué cette modification, vous observez que :

  • L'affichage de la valeur pointée par w (cout << w << endl;) génère 5, comme prévu.
  • Cependant, l'affichage de la valeur de e (*cout << e << endl;) génère étonnamment 2, sa valeur d'origine.

Vous remarquez en outre que l'adresse pointée par w est la même que l'adresse de e (cout << "w = " << w << endl ;cout << "&e = " << Cela vous amène à vous demander comment e reste inchangé malgré la modification apportée via w.

Ce comportement découle du comportement indéfini qui survient lors de la modification d'une constante via un non -pointeur const. Une fois que vous effectuez une telle modification, le code entre dans un territoire de comportement indéfini, où il devient imprévisible et dépend de détails d'implémentation spécifiques.

Dans ce cas, il semble que la modification via w affecte un copie temporaire de e au moment de l'exécution, tandis que l'original e reste inchangé. La raison en est que e est traité comme une constante de compilation et sa valeur est codée en dur dans le code binaire. Par conséquent, toute modification d'exécution apportée à w n'affectera pas le e d'origine.

Ce comportement est spécifique à l'implémentation utilisée et ne doit pas être invoqué. La modification de données constantes via des pointeurs non const est considérée comme une mauvaise pratique et doit être évitée. L'approche correcte consiste à utiliser une référence non const ou à créer une copie non const des données que vous avez l'intention de modifier.

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