„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 07.11.2024
Durchsuche:995

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):

const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w

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

  • Anzeige des Werts, auf den w zeigt ( cout w
  • Die Anzeige des Werts von e (*cout

Sie bemerken außerdem, dass die Adresse, auf die von w gezeigt wird, dieselbe ist wie die Adresse von e (cout cout e trotz der durch w vorgenommenen Änderung unverändert bleibt -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 hat 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 wirken sich Laufzeitänderungen an w nicht auf das ursprüngliche e. aus. 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3