Adressoperator



  • hab hier nen simplen Code der Variablen verschiedener Typen erstellt und deren Speicheradresse ausgibt...

    #include <iostream.h>
    
    int main()
    {
     unsigned short shortVar = 1;
     unsigned long longVar = 1;
     long sVar = 1;
     bool bVar = true;
     double dVar = 1;
     int cVar = 1;
    
     cout << "shortVar" << shortVar;
     cout << "\t";
     cout << &shortVar << "\tByte: " << sizeof(shortVar) << endl;
    
     cout << "longVar " << longVar;
     cout << "\t";
     cout << &longVar << "\tByte: " << sizeof(longVar) << endl;
    
     cout << "sVar\t" << sVar;
     cout << "\t";
     cout << &sVar << "\tByte: " << sizeof(sVar) << endl;
    
     cout << "bVar\t" << bVar;
     cout << "\t";
     cout << &bVar << "\tByte: " << sizeof(bVar) << endl;
    
     cout << "dVar\t" << dVar;
     cout << "\t";
     cout << &dVar << "\tByte: " << sizeof(dVar) << endl;
    
     cout << "cVar\t" << cVar;
     cout << "\t";
     cout << &cVar << "\tByte: " << sizeof(cVar) << endl;
    
     cin.get();
     return 0;
    }
    

    Ausgabe:

    shortVar_1_______0012FF8A________Byte: 2
    longVar__1_______0012FF84________Byte: 4
    sVar_____1_______0012FF80________Byte: 4
    bVar_____1_______0012FF7F________Byte: 1
    dVar_____1_______0012FF74________Byte: 8
    cVar_____1_______0012FF70________Byte: 4

    wenn ich die erste Adresse von shortVar - die 2 von longVar also 0012FF8A - 0012FF84 = 6 -> 6Byte
    Frage: müssten da nicht eigenlich 2 Byte kommen?

    bei den anderen stimmt auch nicht ganz... oder wo liegt mein Denkfehler?

    0012FF8A - 0012FF84 = 6
    0012FF84 - 0012FF80 = 4
    0012FF80 - 0012FF7F = 1
    0012FF7F - 0012FF74 = 11
    0012FF74 - 0012FF70 = 4

    und wie bekomme ich die letzte Speicheradresse von Cvar(also der letzten Variable) heraus 0012FF70 - 4Byte -> 12FF6C
    kann ich mir das auch irgendwie ausgeben lassen?

    insane
    PS: wenn jemand ne Seite/Buch kennt wo beschrieben wird wie der Ram aufgeteilt wird .. aslo Namensbereich, Heap , Register, Codebereich, Stack.. und was/wo da genau passiert (einfach alles detailliert erklärt wird).. nur her mit dem link / Büchervorschlag



  • Hallo,

    ich glaube dein Denkfehler liegt darin, dass du davon ausgehst die Variablen
    wuerden im Speicher hintereinander liegen, was aber nicht zwingend der Fall
    sein muss. Die Variablen liegen innerhalb des deinem Programm zugesicherten
    Speicherbereiches, wo genau sie dort liegen ist unbestimmt.

    Wenn du allerdings ein 'struct' hast, liegen die Variablen hintereinander im
    Speicher, du kannst es ja mal ausprobieren.

    mfg
    v R



  • Bei einem struct oder einer Klasse ist das auch nciht zwingend der Fall, kommt auf die Kompilereinstellung bezüglich packing an!



  • Sprichst du die padding-Bytes an? Werden die nicht nur ans Ende einer Struktur
    angehaengt?

    mfg
    v R



  • 😡 ..und da hab ich ne halbe Stunde gerechnet und überlegt

    danke euch 🤡
    Gruß insane



  • virtuell Realisticer schrieb:

    Sprichst du die padding-Bytes an? Werden die nicht nur ans Ende einer Struktur
    angehaengt?

    Genau die meine ich. Nein, die werden nicht nur an das Ende rangehängt.

    struct
    {
        WORD w;
        char c;
        int i;
    };
    

    Wenn du ein packing von 4 Bytes hast, ist nach c ein paddingbyte dran.



  • Du kannst nur bei Arrays davon ausgehen, dass die Variablen hintereinander abgelegt sind. Genauer gesagt, in einem T[] Array liegen sie sizeof(T) Bytes auseinander.


Anmelden zum Antworten