Maison  >  Article  >  développement back-end  >  Pourquoi la modification d'une valeur « const » via un pointeur non const conduit-elle à un comportement indéfini mais imprime-t-elle toujours des valeurs différentes pour le pointeur et la variable d'origine ?

Pourquoi la modification d'une valeur « const » via un pointeur non const conduit-elle à un comportement indéfini mais imprime-t-elle toujours des valeurs différentes pour le pointeur et la variable d'origine ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 04:47:02227parcourir

Why does modifying a `const` value through a non-const pointer lead to undefined behavior but still print different values for the pointer and the original variable?

Modifier un const via un pointeur non-const

Considérez le code suivant :

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

int* w = (int*) &e;          // (1) cast to remove const-ness
*w = 5;                        // (2)

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

cout << "w = " << w << endl;   // (5) w points to the address of e
cout << "&e = " << &e << endl;</code>

In (1 ), w pointe vers l’adresse de e. Dans (2), cette valeur est remplacée par 5. Cependant, lorsque les valeurs de *w et e sont affichées, leurs valeurs sont différentes. Mais si vous imprimez le pointeur w et l'adresse de e, ils ont la même valeur.

Comment se fait-il que e contienne toujours 2, même s'il a été changé en 5 ? Étaient-ils stockés dans un endroit séparé ? Ou un temporaire ? Mais comment se fait-il que la valeur pointée par w soit toujours l'adresse de e ?

Réponse

Une fois que vous modifiez une valeur const, vous entrez dans un territoire de comportement indéfini. Cependant, pour spéculer :

  • (3) et (4) : *w est évalué au moment de l'exécution, tandis que e est traité comme une constante de compilation. D'où les différentes valeurs imprimées.

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