Heim  >  Artikel  >  Backend-Entwicklung  >  Warum scheint das Ändern einer „const“-Variablen über einen Nicht-Const-Zeiger zu funktionieren, ändert aber nicht tatsächlich ihren Wert?

Warum scheint das Ändern einer „const“-Variablen über einen Nicht-Const-Zeiger zu funktionieren, ändert aber nicht tatsächlich ihren Wert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 08:35:02138Durchsuche

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

Ändern einer Konstante durch einen Nicht-Konstanten-Zeiger

In C kann eine Konstantenvariable nach der Initialisierung nicht mehr geändert werden. In bestimmten Szenarien kann es jedoch so aussehen, als ob eine Konstantenvariable geändert wurde. Betrachten Sie den folgenden Code:

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

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

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

Wenn Sie diesen Code ausführen, werden Sie ein unerwartetes Verhalten bemerken:

5
2

Auch wenn *w in (2) in 5 geändert wurde, e behält immer noch seinen ursprünglichen Wert von 2. Dieses scheinbar paradoxe Verhalten ist auf die folgenden Faktoren zurückzuführen:

  • (1) Die Dereferenzierung eines Konstantenzeigers (w) ermöglicht eine Änderung.
  • (2 ) Der geänderte Wert wird an dem Speicherort gespeichert, auf den w zeigt, was in diesem Fall der Speicherort ist, an dem e gespeichert ist.
  • Der Compiler optimiert jedoch den Code, indem er e als Konstante zur Kompilierungszeit behandelt und es nicht zur Laufzeit auszuwerten.

Wenn *w zur Laufzeit ausgewertet wird, gibt es daher den geänderten Wert (5) zurück. Wenn e jedoch zur Kompilierungszeit ausgewertet wird, wird sein ursprünglicher Wert (2) verwendet.

Dieses Verhalten wird in C als undefiniertes Verhalten bezeichnet. Das direkte oder indirekte Ändern einer const-Variable führt zu unvorhersehbaren Konsequenzen, und in solchen Situationen ist Vorsicht geboten.

Das obige ist der detaillierte Inhalt vonWarum scheint das Ändern einer „const“-Variablen über einen Nicht-Const-Zeiger zu funktionieren, ändert aber nicht tatsächlich ihren Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn