Zum Inhalt springen

const int ändern...


ffGebaeck

Empfohlene Beiträge

Also, folgendes seltsames Phänomen,

ich hab ein bisschen gebastelt, wollte einen

const int ändern, hab auch was gefunden was ihn ändert,

aber irgendwie nicht richtig.


const int nConstWert = 100;

int* pAufConstWert = const_cast<int*>(&nConstWert);

* pAufConstWert = 50;

int nErgebnis = nConstWert + 50;

Wenn man im Debugger den Code durchgeht und die Variablen

überwacht, ändert sich der const int tatsächlich auf 50,

wenn ich aber mit dem const rechne, und z.B. 50 addiere kommt 150 raus, er behält also den alten wert irgendwo zum rechnen, in der Speicherzelle steht aber 50.

Wo behält er den alten Wert und weshalb ist des so?

Ich benutz VisualC++6.0

JO;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur so auf die Schnelle: hab das auch mal gebraucht, allerdings waren meine Deklarationen Zeigerorientiert:

Mit diesem Code klappt die Const-Veränderung:

#include <iostream.h>

int main()

{

const int* y=new int;

int* x=new int;

x=const_cast<int*>(y);

*x=30;

cout << "Test=" << *y <<"\n\r";

*x=100;

cout << "Test=" << *y <<"\n\r";

delete x,y;

return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe das Ganze jetzt mal durch meinen Debugger gejagt und folgendes ist herausgekommen:

Der Pointer "pAufConstWert" zeigt nicht wirklich auf "nConstWert". Die Adresse ist eine andere.

Habe dann mal ein paar andere elementare Datentypen angelegt und Pointer draufzeigen lassen. Hier war alles, wie es sein sollte...

Warum das allerdings so ist, kann ich auch nicht genau sagen!

Grüsse

DocMabuse

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab das ganze auch mal ausprobiert und festgestellt das mit den Pointer-Addressen alles stimmt. Wenn man sich den Assembler Code (ich benutze Visual C++6 als Compiler) dazu ansieht, dann ist es eigentlich ganz leicht zu erklären. Bei der Zuweisung:

int nErgebnis = nConstWert + 50;

schreibt der Compiler

int nErgebnis = 150;

das heißt der Wert steht schon zu Beginn fest im Code. Der Compiler sieht das nConstWert als konstanter Integer 100 definiert ist und ersetzt deshalb jedes Vorkommen mit dem konkreten Wert. Jede Manipulation der Variablen während des Programms bleibt also unberücksichtigt. Dieses Verhalten ist compilerabhängig und in den Standards nicht definiert. Nach der Zeile * pAufConstWert = 50;

ist jeder Ausdruck der nConstWert benutzt nicht definiert. Ich habe auf Google einige Posts zu diesem Thema gefunden und bei einigen Compilern würde 100 und bei anderen 150 herauskommen.

Um wirklich den aktuellen Wert aus dem Speicher zu lesen müsste man in dem Fall:

int nErgebnis = *const_cast<int*>(&nConstWert) + 50;

schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wirklich nen interessantes Problem.

Ich denk mir aber das bei einem C++ Compiler 150 rauskommen muß wenn man mal das folgende aus der Hilfe zu const-Values

aus dem Visual C++ 6.0 Compiler in Betracht zieht:

In C++, you can use the const keyword instead of the #define preprocessor directive to define constant values. Values defined with const are subject to type checking, and can be used in place of constant expressions. In C++, you can specify the size of an array with a const variable as follows:

const int maxarray = 255;

char store_char[maxarray]; // Legal in C++; illegal in C

Das kann meiner Meinung eigentlich nur funktionieren, wenn der

Compiler maxarray als Alias( also wie ein #define für den Wert 255 betrachtet, nur mit dem Unterschied, daß das nicht vom Präprozessor wie ein Textersatz behandelt wird, sondern vom Compiler verarbeitet wird ).

Witzigerweise lässt sich der Compiler auch nicht von Konstruktionen wie

nErgebnis = *(&nConstWert) + 50;

beeindrucken.

Er schreibt auch hier fest an der Speicherstelle von nErgebnis den

Wert 150.

mov dword ptr [ebp-74h],96h

Hoagi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...