"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la modification d'une variable « const » via un pointeur non-const semble-t-elle fonctionner, mais ne change-t-elle pas réellement sa valeur ?

Pourquoi la modification d'une variable « const » via un pointeur non-const semble-t-elle fonctionner, mais ne change-t-elle pas réellement sa valeur ?

Publié le 2024-11-07
Parcourir:274

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn\'t Actually Change Its Value?

Modification d'une const via un pointeur non-const

En C , une variable const ne peut pas être modifiée une fois initialisée. Cependant, dans certains scénarios, il peut sembler qu'une variable const ait été modifiée. Considérons le code suivant :

const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout 

Si vous exécutez ce code, vous remarquerez un comportement inattendu :

5
2

Même si *w a été remplacé par 5 dans (2), e conserve toujours sa valeur d'origine de 2. Ce comportement apparemment paradoxal découle des facteurs suivants :

  • (1 ) Le déréférencement d'un pointeur const (w) permet une modification.
  • (2) La valeur modifiée est stockée dans l'emplacement mémoire pointé par w, qui dans ce cas est l'emplacement mémoire où e est stocké.
  • Cependant, le compilateur optimise le code, en traitant e comme une constante de compilation et en ne l'évaluant pas au moment de l'exécution.

Par conséquent, lorsque *w est évalué au moment de l'exécution, il renvoie la valeur modifiée (5). Cependant, lorsque e est évalué au moment de la compilation, sa valeur d'origine (2) est utilisée.

Ce comportement est connu sous le nom de comportement non défini en C . La modification d'une variable const entraîne directement ou indirectement des conséquences imprévisibles, et il convient de faire preuve de prudence dans de telles situations.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3