Arrayverwirrung



  • Hallo zusammen,

    ich habe im Moment das Problem, dass ich nicht verstehe, warum das hier so abläuft wie es abläuft.

    DWORD64 shift[4] = { 0, 0, 0, 0 };
    DWORD dr = (DWORD)&shift;
    int temp = 0;
    *(DWORD64*)(dr+temp*sizeof(DWORD64)) = 0x1;
    temp++;
    *(DWORD64*)(dr+temp*sizeof(DWORD64)) = 0x2;
    String bla;
    bla.sprintf("%x %x %x %x %d",shift[0],shift[1],shift[2],shift[3],temp);
    ShowMessage(bla);
    

    Das ergibt folgende Ausgabe:
    1 0 2 0 0
    Ich erwarte aber eigentlich
    1 2 0 0 1

    Wenn ich das DWORD64 durch zB char ersetze funktioniert das ganze problemlos so wie man es erwartet. Funktioniert diese Pointermethode nicht bei einer 64bit Variablen?

    greetz KN4CK3R

    Edit: falsches Forum, sollte eigentlich nach C, ist ja nichts C++ spezifisches
    Edit2: hat sich mittlerweile geklärt, DWORD statt DWORD64 geht auch. Interessiert mich aber trotzdem warum das nicht so funktioniert wie es soll.



  • DWORD64 = 8 byte unsigned
    DWORD = 4 byte unsigned
    0x1/0x2 = 4 byte (jeweils) unsigned(!)

    0x1 passt problemlos in DWORD was wiederum problemlos in DWORD64 passt.
    in den ersten 8 byte sollte also die 1 stehen und 8 byte später die 2.

    Dein dw64Schift 0
    00000000 00000000 00000000 00000000 
    00000000 00000000 00000000 00000001
    
    Dein dw64shift 1
    00000000 00000000 00000000 00000000 
    00000000 00000000 00000000 00000010
    
    shift dw642/3 
    00000000 00000000 00000000 00000000 
    00000000 00000000 00000000 00000000
    

    Wie der ganze Kram jetzt dargestellt wird hängt von der Interpretation ab, ändert jedoch nichts daran wie das Teil im Speicher aussieht.

    gibst du shift 0 - 4 als DWORD64 Array aus erhälst du 12 00
    weil der indexoperator jeweils 8 byte springt

    gibst du shift 0 - 4 als DWORD-array aus, erhälst du 1 0 2 0
    weil du halt jeweils nur um 4 byte springst.

    Das hießt, mit shift 0 - 4 als DWORD ausgegeben, liest du nur die ersten beiden DWORD64 - Werte aus.
    In meiner Darstellung habe ich zwei zeilen angegeben, die 0 die an der zweiten Stelle ausgegeben wird, ist die Nullreihe in der zweiten Zeile deiens dw64shift0

    und die 2 an der dritten Stelle der Wert aus den Ersten 4 Byte deiens dw64shift1

    EDIT:
    In meinem Beispiel liest man von die Bytewerte von unten nach oben und von rechts nach links.



  • ah ok, also müsste ich um mir das richtige ausgeben zu lassen eine 64bit Version von %x benutzen, weil das normale %x nicht weit genug reicht.

    Danke für die Erklärung, war schön anschaulich.

    greetz KN4CK3R


Anmelden zum Antworten