Structanordnung fehlerhaft
-
Nabend.
Habe folgendes Problem ... betrachten wir erst mal ne vereinfachte Form meines Sourcecodes:
#include <stdio.h> #include <windows.h> struct test { BYTE x1; DWORD x2; }; int main( void ) { BYTE byteArr[] = { 0x10, 0x11, 0x12, 0x13, 0x14 }; test *tStruct = ( test * )byteArr; printf( "x1: %X\nx2: %X\n\n", tStruct->x1, tStruct->x2 ); system( "pause" ); return 0; };Erwartete Ausgabe wäre nach meinem Erachten folgende:
x1: 10 x2: 14131211 Drücken Sie eine beliebige Taste . . .Leider bekomme ich nur folgendes:
x1: 10 x2: CCCCCC14 Drücken Sie eine beliebige Taste . . .Als ich den ganzen Kram noch etwas komplexer in meinem eigentlichen Sourcecode hatte, dachte ich, es läge an dem BYTE-Array, was ich bis dahin noch nutze.
Erst die vereinfachte Form zeigt mir, dass ich irgendwas übersehe...
Hat jemand ne Idee?
Wäre echt dankbar!!
Gruß, paSe
-
Padding

-
Padding? ^^
Meinst du ich soll das mit memset auf 0 setzen?
Edit:
Oder meinst du, dass ich hinter die 0x10 3 mal 0x0 quetschen muss, weil DWORD 4*8 BYTE groß ist und demnach in 4er Schritten einliest?
Das würde dann evtl erklären wieso ich bei
BYTE byteArr[9] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };so eine Ausgabe bekomme:
x1: 10 x2: 17161514 Drücken Sie eine beliebige Taste . . .... kann mir das aber eigentlich nicht vorstellen.
Das muss auch anders gehen die 11 - 14 in DWORD zu quetschen ohne das mit Nullen aufzufüllen nur damits jeweils 4 BYTE sind.
-
Entschuldige, ich war ein wenig wortkarg
Ich meine, dass die BYTE-Variable in deiner Struktur wahrscheinlich durch Padding 4 Bytes an Platz beansprucht. Als Lösung könntest du die Reihenfolge der Variablen umtauschen, für die Struktur Padding per Compiler-Schalter ausschalten oder dich damit abfinden.
Übrigens gibt's sogar nen Wikipedia-Artikel zu "Padding"
-
Na Ahnung wo ich das in VS 05/08 abschalte?
Ich nehme an in den Projekteigenschaften?
Die Reihenfolge kann ich leider nicht ändern, da das BYTE-Array empfangene Datenpackete sind und die Struktur vom Server vorgegeben ist.

-
unlimieD.paSe schrieb:
Na Ahnung wo ich das in VS 05/08 abschalte?
Ich glaube, es war sowas wie "pragma pack".
edit: Hinter "pragma pack" kommt noch ein Parameter, frag einfach mal Google.
-
Danke!
Edit: #pragma pack(push, 1)
-
Und nicht vergessen wieder anzuschalten:
#pragma pack(pop)
-
David_pb schrieb:
Und nicht vergessen wieder anzuschalten:
Du meinst sicher abzuschalten.

Aber man sollte daran denken, dass
#pragma-Direktiven womöglich nicht mehr funktionieren, wenn man sie auf einen anderen Compiler portiert. Wobei bei einem sinnvollen Compiler (genauer gesagt Präprozessor) eine Warnung entstehen sollte, wenn das#pragmaunbekannt ist.
-
Nexus schrieb:
David_pb schrieb:
Und nicht vergessen wieder anzuschalten:
Du meinst sicher abzuschalten.

Kommt auf den Blickwinkel an!
