Maison > développement back-end > C++ > 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
Libérer: 2024-10-29 05:31:02
original
927 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal