Variablen && deklarieren %% initialisieren!
-
Hallo Forum!
Kann mir jemand diese Fragen beantworten:
Ich deklariere eine Variable
int a;
in main();
bzw. in einer Funktion func();
Was macht der Compilier damit, wo steht die Variable
im Maschinencode.Was passiert anschliessend, wenn ich die Variable initialisiere?
Gibt es hier unterschiede?
Danke für eure Hilfe!
-
Die Variable befindet sich auf dem Stack;(Bereich im Speicher)
Der Stackpointer in ESP(ein register der CPU) wird dekrementiert da der Stack nach unten Anwächst.(von größeren zu kleineren Adressen)
Beim initialisieren wird ein Wert in diesen Speicherbereich geschrieben.
Das wars schon
-
Es heisst immer:
Im Speicherabbild steht der Programmcode ganz unten, also weder Ram noch Heap.
Ist dort auch die Variabe a?
-
Die variable a steht sicher nicht in codesegment!
Im codesegment steht nur der code der zur ausführung des progs benötigt wird.
Alle lokalen variablen befinden sich auf dem Stack.
Im codesegment ist es umgekehrt(mit den Adressen):
Dieser beginnt bei niedrigen Adressen.
-
Woher weiss dann aber das prog, dass an dieser Stelle die Variable a initialisiert werden soll?
-
Ganz einfach:
Das Prog weiß unter welcher Adresse sich die variable befindet!!!!!
Die Adresse steht im (Assembler)Quellcode...naja nicht direkt die Adresse ... es wird mit offsets gearbeitet.(Offsets zu einer Adresse in einem Register)
Wenn du dich dafür interessierst , würde ich dir empfehlen Assembler zu lernen!
Dann wirst du alles darüber wissen.
-
lässt sich also zusammenfassend sagen, im prog (maschinencode) befindet sich bei
der Variablen a ein sprung zu einer addresse im ram,
speicher wird so oder so benötigt, weil ich einmal den sprung codieren muss
und zweitens dann der variablen den wert zuweisen muss,
deshalb kann man sagen, sofern die variable nicht initialisiert wurde,
belegt sie auch keinen speicher (aber es gibt einen sprung) erst mit der
initialisierung gibt es eine zuweisung (wieder speicher, jetzt aber im ram)
-
Du verwechselst da was.
Wenn du folgendes schreibst , dann gibt es keinen Sprung ins Ram:int a;
Hierbei wird lediglich Speicher für die Variable a reserviert.
Und wenn du folgendes schreibst:
a = 7;
.dann findet genauso wenig ein Sprung statt.
Es wird lediglich auf den Speicher zugegrifen(mit dem Wert 7 beschrieben)
-
Zero_Clamping schrieb:
lässt sich also zusammenfassend sagen, im prog (maschinencode) befindet sich bei
der Variablen a ein sprung zu einer addresse im ram,Nein. Die Variable ist sozusagen einfach nur ein Bezeichner, der der entsprechenden Adresse, bzw. dem dort vorhandenen Speicher, zugeordnet wird. Das macht der Compiler zur Kompilierungszeit, dh diese Zuordnung erfolgt beim eigentlichen Übersetzen. Deshalb gibt es im Quellcode keine Adressen und im Maschinencode keine Bezeichner.
Zero_Clamping schrieb:
speicher wird so oder so benötigt, weil ich einmal den sprung codieren muss
und zweitens dann der variablen den wert zuweisen mussSpeicher wird benötigt, das ist richtig. Aber keine der Erklärungen ist dafür verantwortlich. Schau dir mal an, was Definition bedeutet. Nämlich genau dann wird Speicher benötigt.
Zero_Clamping schrieb:
deshalb kann man sagen, sofern die variable nicht initialisiert wurde,
belegt sie auch keinen speicher (aber es gibt einen sprung) erst mit der
initialisierung gibt es eine zuweisung (wieder speicher, jetzt aber im ram)Nope.