Heim > Backend-Entwicklung > C++ > Wie kann eine Variable an derselben Speicheradresse in C zwei verschiedene Werte haben?

Wie kann eine Variable an derselben Speicheradresse in C zwei verschiedene Werte haben?

Patricia Arquette
Freigeben: 2024-11-29 00:37:11
Original
192 Leute haben es durchsucht

How Can a Variable at the Same Memory Address Have Two Different Values in C  ?

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;
}
Nach dem Login kopieren

Überraschenderweise offenbart die Ausgabe dieses Codes eine Inkonsistenz:

40 65
0xbfacbe8c 0xbfacbe8c
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage