Ä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:
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!