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 1Wenn 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 00000000Wie 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 springtgibst 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 dw64shift0und 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