Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt das Ändern einer Konstante durch einen nicht konstanten Zeiger zu undefiniertem Verhalten?

Warum führt das Ändern einer Konstante durch einen nicht konstanten Zeiger zu undefiniertem Verhalten?

Linda Hamilton
Linda HamiltonOriginal
2024-10-29 05:31:02897Durchsuche

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

Ändern einer Konstante durch einen nicht konstanten Zeiger: Eintauchen in undefiniertes Verhalten

Im bereitgestellten Codeausschnitt äußern Sie Verwirrung über das Verhalten des Modifizierens einer konstanten Ganzzahl (e) durch einen nicht-konstanten Zeiger (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>

Nachdem Sie diese Änderung vorgenommen haben, stellen Sie Folgendes fest:

  • Die Anzeige des Werts, auf den w (cout << w << endl;) zeigt, gibt wie erwartet 5 aus.
  • Wenn Sie jedoch den Wert von e (*cout << e << endl;) anzeigen, wird überraschenderweise 2 ausgegeben, der ursprüngliche Wert.

Sie bemerken es weiter dass die Adresse, auf die w zeigt, dieselbe ist wie die Adresse von e (cout << "w = " << w << endl ;cout << "&e = " << Dies führt zu der Frage, wie e trotz der durch w vorgenommenen Änderung unverändert bleibt.

Dieses Verhalten ist auf das undefinierte Verhalten zurückzuführen, das auftritt, wenn eine Konstante durch eine Nicht-Konstante geändert wird -const-Zeiger. Sobald Sie eine solche Änderung vornehmen, gelangt der Code in ein undefiniertes Verhaltensgebiet, wo er unvorhersehbar wird und von bestimmten Implementierungsdetails abhängt.

In diesem Fall scheint es, dass die Änderung durch w Auswirkungen auf a temporäre Kopie von e zur Laufzeit, während das ursprüngliche e unverändert bleibt. Der Grund dafür ist, dass e als Konstante zur Kompilierungszeit behandelt wird und ihr Wert fest im Binärcode codiert ist. Daher haben Laufzeitänderungen an w keine Auswirkungen auf das ursprüngliche e.

Dieses Verhalten ist spezifisch für die verwendete Implementierung und sollte nicht als verlässlich angesehen werden. Das Ändern konstanter Daten durch nicht konstante Zeiger gilt als schlechte Praxis und sollte vermieden werden. Der richtige Ansatz besteht darin, eine nicht konstante Referenz zu verwenden oder eine nicht konstante Kopie der Daten zu erstellen, die Sie ändern möchten.

Das obige ist der detaillierte Inhalt vonWarum führt das Ändern einer Konstante durch einen nicht konstanten Zeiger zu undefiniertem Verhalten?. 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