Verständnisfrage: Lokale Variablen im Speicher



  • Zu meinem Bedauern kann ich leider nicht so viel mit Assemblercode anfangen. Die 12 Byte werden jedoch sowohl im Debug- als auch im Release-Modus reserviert.



  • Haste noch eine 4. Variable deklariert ?



  • Nope. Das ist alles:

    #include <stdio.h>
    
    int main () {
    	int var1;
    	int var2[2];
    	int var3;
    	printf ("var1: 0x%x\nvar2: 0x%x\nvar3: 0x%x\n",
    			&var1, &var2, &var3);
        return 0;
    }
    


  • was steht denn in den 4 überflüssigen bytes drin? zufälligerweise sowas wie 0xcccccccc?
    🙂



  • +fricky schrieb:

    was steht denn in den 4 überflüssigen bytes drin? zufälligerweise sowas wie 0xcccccccc?
    🙂

    Nein, dieser Wert steht leider nicht drin. Aber mir ist folgendes aufgefallen:

    [DEBUG]
    Byte1: 0x0
    Byte2: variiert
    Byte3: 0xfd
    Byte4: 0x7f
    
    [RELEASE]
    Byte1: 0x3e
    Byte2: 0x0
    Byte3: 0x0
    Byte4: 0x0
    

    Ist zwar recht interessant, hilft mir aber leider trotzdem nicht, es zu verstehen. 😞



  • Das werden Padding-Bytes sein.

    Wie schon geschrieben wurde, Compiler dürfen sich viel genehmigen, auch etxra Bytes einfügen wenn der Computer so besser damit rechnen kann.



  • The-Kenny schrieb:

    Das werden Padding-Bytes sein.

    Na ok. Ich weiß, dass es bei structs Padding-Bytes gibt, aber bei Arrays war's mir bisher nicht geläufig.

    Dann bedanke ich mich mal recht herzlich für eure Hilfe. Hab' wieder etwas dazu gelernt 🙂



  • Naja Padding ... technisch gesehen ist Padding hier nicht notwendig, vom Standard her gibt es Padding nur innerhalb von Strukturen -- warum sollte es auch Garantien zum Layout irgendwelcher unzusammengehöriger Objekte geben? Warum der Compiler das machen sollte? Keine Ahnung, mein gcc hat jedenfalls bei dem Beispiel keine Lücken gelassen.



  • monstermunchkin schrieb:

    +fricky schrieb:

    was steht denn in den 4 überflüssigen bytes drin? zufälligerweise sowas wie 0xcccccccc?
    🙂

    Nein, dieser Wert steht leider nicht drin.

    ok, damit 'initialisiert' der msvc(2005) uninitialisierte variablen. welchen compiler benutzt du denn und auf welchem system läuft das?
    🙂



  • +fricky schrieb:

    welchen compiler benutzt du denn und auf welchem system läuft das?
    🙂

    Es läuft auf einem 32-Bit Vista mit MinGW.

    Bashar schrieb:

    Keine Ahnung, mein gcc hat jedenfalls bei dem Beispiel keine Lücken gelassen.

    Mein gcc macht das auch ohne Probleme.

    Das "Problem" scheint also MinGW zu verursachen.



  • monstermunchkin schrieb:

    Das "Problem" scheint also MinGW zu verursachen.

    Ich hab's jetzt durch drei Compiler gejagt, die machen das alle ohne Lücke. Provozieren kann ich sowas Ähnliches nur, wenn z.B. var3 ein char ist und ich bei einem embedded Compiler für einen 16-Bitter compiliere. Dann füllt er mir das char zum 16-Bit int auf, das kann man aber auch mit irgendeinem Switch unterbinden.

    Wie Du erkannt hast: Es ist ja kein Bug, solange auf die richtigen Speicherplätze zugegriffen wird, nur ein paar Byte Speichervergeudung.


Anmelden zum Antworten