union in struct
-
hallo leute,
folgender code ausschnitt:
#include <stdio.h> typedef struct { unsigned int i1; unsigned int i2; } TwoInts; typedef struct { unsigned char c; union { TwoInts t; }; } A; int main() { printf("%d\n", sizeof(TwoInts)); printf("%d\n", sizeof(unsigned char)); printf("%d\n", sizeof(A)); return 0; }
kann mir bitte einer erklären warum die größe von A "12" ist und nicht "9"?
(sizeof TwoInts ist 8 und von unsigned char 1)wenn ich z.b. A so umändere:
typedef struct { unsigned char c; union { unsigned char dummy[sizeof(TwoInts)]; }; } A;
dann ist die größe von A "9".
woran liegt das?
danke!
Gruß mathik
-
habe das problem noch weiter eingegrenzt:
#include <stdio.h> struct A{ char c; int i; }; int main() { printf("%d\n", sizeof(int)); printf("%d\n", sizeof(char)); printf("%d\n", sizeof(A)); return 0; }
größe von A ist "8"
warum nicht "5"?
Gruß mathik
-
Weil dein Compiler offensichtlich Variablen auf Doppelwortgrenzen ausrichtet. Dazu gibt es bei jedem Compiler einen Schalter, der bei dir halt standardmäßig auf Doppelwortgrenzen legt (also 4 Byte). Lies mal in der Compiler-Doku nach, müsste was zu drin stehen
-
Hi mathik,
Deadlef hat Recht. Wenn du mit VC++ arbeitest geht das so:#pragma pack (push, 1) struct X ... ... #pragma pack (pop)
-
danke für die antworten...
kennt ihr vielleicht gute internetquellen zum thema alignment?
ich muss meine structs nämlich portabel halten, da diese über ein protokoll versendet werden.google findet irgendwie nichts brauchbares...
danke!
Gruß mathik
-
mathik schrieb:
ich muss meine structs nämlich portabel halten, da diese über ein protokoll versendet werden.
Dann würde ich empfehlen, eine eigene Methode zu schreiben, die die einzelnen Elemente der Struct übers Netzwerk schickt (und nicht die ganze Struct auf einmal). Da kannst Du dann gleich auf solche Dinge wie Byte-Order, etc. denken.