Enthüllung des Rätsels der Inkonsistenzen variabler Adressen: Ein Einblick in undefiniertes Verhalten
Im verwirrenden Bereich der Variablen stellt sich eine eigenartige Frage: Wie Ist es möglich, dass eine Variable an derselben Adresse zwei unterschiedliche Werte liefert? Um dieses Rätsel zu lösen, schauen wir uns einen Codeausschnitt an, der dieses ungewöhnliche Verhalten demonstriert.
Betrachten Sie den folgenden C-Code:
#include <iostream> using namespace std; int main(void) { const int a1 = 40; const int* b1 = &a1; char* c1 = (char *)(b1); *c1 = 'A'; int *t = (int*)c1; cout << a1 << " " << *t << endl; cout << &a1 << " " << t << endl; return 0; }
Überraschenderweise offenbart die Ausgabe dieses Codes eine Inkonsistenz:
40 65 0xbfacbe8c 0xbfacbe8c
Die Variable 'a1', die als const deklariert ist, behält ihren ursprünglichen Wert von 40. „t“, ein Zeiger, der auf denselben Speicherort wie „b1“ zeigt, weist jedoch einen Wert von 65 („A“ in ASCII) auf. Wie ist das möglich?
Die Antwort liegt im Konzept des undefinierten Verhaltens. In diesem Fall löst das Ändern einer const-Variablen (in diesem Fall „a1“) undefiniertes Verhalten gemäß dem C-Standard (7.1.6.1) aus. Dadurch werden die Ergebnisse unvorhersehbar und können zwischen verschiedenen Compilern oder sogar verschiedenen Ausführungen desselben Codes variieren.
Der C-Standard besagt eindeutig, dass „jeder Versuch, ein const-Objekt während seiner Lebensdauer zu ändern, zu undefiniertem Verhalten führt.“ ." Mit anderen Worten, das Verhalten solcher Modifikationen wird nicht durch die Sprache definiert, sodass es zu willkürlichen Ergebnissen führen kann.
In diesem speziellen Beispiel ist die Modifikation des Zeichens, auf das „c1“ zeigt (was dasselbe ist). Speicherort als „a1“) führt zu einer unerwarteten Änderung des über „t“ abgerufenen Werts. Dies liegt daran, dass die Typkonvertierungen zwischen „char“ und „int“ die Interpretation der an diesem Speicherort gespeicherten Daten effektiv neu definieren.
Es ist wichtig zu beachten, dass sich undefiniertes Verhalten auf verschiedene Weise manifestieren kann Dazu gehören das vollständige Ignorieren der Situation, das Erzeugen einer Diagnosemeldung oder das Beenden des Programms. Daher ist es wichtig, das Aufrufen undefinierten Verhaltens im Produktionscode zu vermeiden, um eine vorhersehbare und zuverlässige Programmausführung sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie kann eine Variable an derselben Speicheradresse in C zwei verschiedene Werte haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!