Ä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:
const int e = 2;
int* w = (int*)&e; // (1)
*w = 5; // (2)
cout Wenn Sie diesen Code ausführen, werden Sie ein unerwartetes Verhalten bemerken:
5
2
Obwohl *w in (2) in 5 geändert wurde, behält e 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 Kompilierzeitkonstante behandelt und ihn nicht zur Laufzeit auswertet.
Als Ergebnis wird *w bei der Auswertung zur Laufzeit zurückgegeben der geänderte Wert (5). Wenn e jedoch zur Kompilierzeit 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.
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