Wie erzeugt eine Variable an derselben Adresse 2 verschiedene Werte? [duplicate]

Lesezeit: 4 Minuten

Wie erzeugt eine Variable an derselben Adresse 2 verschiedene Werte
shrinidhisondur

Bedenken Sie :

#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;
}

Die Ausgabe dafür ist:

40 65 
0xbfacbe8c 0xbfacbe8c

Dies scheint mir fast unmöglich, es sei denn, der Compiler nimmt Optimierungen vor. Wie ?

  • Wenn Ihre Frage beantwortet wurde, markieren Sie bitte die Antwort, die Ihrer Meinung nach am besten zu Ihrer Frage passt, als akzeptiert, anstatt einen Kommentar zu posten, in dem Sie sich beim Beantworter bedanken. Sie können auch die akzeptierte Antwort und alle anderen Antworten, die Sie nützlich fanden, positiv bewerten.

    – Adi Inbar

    10. Juli 2014 um 15:44 Uhr


  • Danke. Ich werde mir das merken.

    – Shrinidhisondur

    11. Juli 2014 um 0:45 Uhr

Wie erzeugt eine Variable an derselben Adresse 2 verschiedene Werte
Shafik Yaghmur

Das ist undefiniertes Verhalten, ändern Sie eine konstante Variable, sodass Sie keine Erwartungen an die Ergebnisse haben können. Wir können dies sehen, indem wir zum Abschnitt Entwurf des C++-Standards gehen 7.1.6.1 Die CV-Qualifikanten Absatz 4 was sagt:

[…]Jeder Versuch, ein konstantes Objekt während seiner Lebensdauer (3.8) zu ändern, führt zu undefiniertem Verhalten.

und liefert sogar ein Beispiel:

const int* ciq = new const int (3); // initialized as required
int* iq = const_cast<int*>(ciq); // cast required
*iq = 4; // undefined: modifies a const object

In der Standarddefinition von undefiniertes Verhalten im Abschnitt 1.3.24gibt die folgenden möglichen Verhaltensweisen an:

[…] Zulässiges undefiniertes Verhalten reicht vom völligen Ignorieren der Situation mit unvorhersehbaren Folgen über ein für die Umgebung charakteristisches Verhalten bei der Übersetzung oder Programmausführung (mit oder ohne Ausgabe einer Diagnosemeldung) bis hin zum Abbruch einer Übersetzung oder Ausführung (mit Ausgabe einer Diagnosemeldung). einer Diagnosemeldung). […]

  • Warum führt das Ändern einer konstanten Variablen zu undefiniertem Verhalten?

    – Ben

    26. März 2014 um 9:42 Uhr

  • @Ben Weil die Spezifikation es sagt.

    – Bart van Nierop

    26. März 2014 um 9:43 Uhr

  • @Ben Wie Bart sagt, weil der Standard es so sagt. Der Standard sagt dies aus, 1) damit der Compiler die Variable in den Nur-Lese-Speicher stellen kann (Ihr Versuch, sie zu ändern, könnte beispielsweise zum Absturz des Programms führen) und 2) um dem Compiler zu ermöglichen, die Variable weiterzugeben konstanter Wert als konstanter Ausdruck: wenn Sie später schreiben char arr[a1];wie groß soll das Array sein?

    – James Kanze

    26. März 2014 um 9:48 Uhr

  • @JamesKanze Okay, danke.

    – Ben

    26. März 2014 um 9:49 Uhr

  • @ben eine Konstante sollte konstant sein, wenn sie sich ändert, sollte sie keine Konstante sein. Das zu versuchen, ist also semantisch Unsinn. Was würde passieren, wenn jemand den Wert von PI mitten in einem Lauf ändert? Unsinniges, undefiniertes Verhalten. Mit C++ können Sie sehr gefährliche Dinge machen (das ist eine der Stärken von C++), aber gefährlich führt leider manchmal zu Unsinn.

    – Jean-Baptiste Yunes

    24. Mai 2014 um 9:19 Uhr

Ihr Code hat ein undefiniertes Verhalten, da Sie ein konstantes Objekt ändern. Irgendetwas kann passieren, nichts ist unmöglich.

Wenn Sie sie Variablen qualifizieren const Der Compiler kann ein paar Dinge annehmen und Code generieren, das funktioniert gut, vorausgesetzt, Sie respektieren diese Vereinbarung und brechen sie nicht. Wenn Sie es gebrochen haben, erhalten Sie undefiniertes Verhalten.

Beachten Sie, wann const entfernt wird, funktioniert es wie erwartet; Hier ist ein Live-Beispiel.

Wie von anderen erklärt wurde, ändern Sie a const value führt zu undefiniertem Verhalten und es muss nichts weiter gesagt werden – jedes Ergebnis ist möglich, einschließlich völliger Unsinn oder eines Absturzes.

Wenn Sie neugierig sind, wie diese besondere Ergebnis zustande kam, liegt es mit ziemlicher Sicherheit an der Optimierung. Da hast du definiert a zu sein conststeht es dem Compiler frei, den Wert zu ersetzen 40 die Sie ihm zugewiesen haben, wann immer es will; schließlich kann sich sein Wert nicht ändern, oder? Dies ist nützlich, wenn Sie verwenden a um beispielsweise die Größe eines Arrays zu definieren. Sogar in gcc, das eine Erweiterung für Arrays mit variabler Größe hat, ist es für den Compiler einfacher, ein Array mit konstanter Größe zuzuweisen. Sobald die Optimierung vorhanden ist, wird sie wahrscheinlich konsequent angewendet.

963590cookie-checkWie erzeugt eine Variable an derselben Adresse 2 verschiedene Werte? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy