mein struct ist größer als er sein sollte.
-
Hallo Ich habe zwei structs:
struct mac_addr { uint8_t a; uint8_t b; uint8_t c; uint8_t d; uint8_t e; uint8_t f; }; struct arp_packet_t { uint16_t hw_type; uint16_t proto_type; uint8_t hw_size; uint8_t proto_size; uint16_t opcode; struct mac_addr src_mac; uint32_t src_ip; struct mac_addr dest_mac; uint32_t dest_ip; };
Der erste struct hat eine Größe von sizeof(struct mac_addr) = 6 Bytes - so wie es sein soll.
Aber der zweite struct hat eine Größte von sizeof(struct arp_packet_t) = 32 Bytes - es sollten aber nur 28 sein!
Wo kommen sie zusätzlichen 4 Bytes her? Was habe ich übersehen?
-
Der Compiler richtet den uint32_t auf 32-Bit-Wortgrenzen aus, da Du aber mit der vorigen struct (wegen der 6 Bytes Länge) nicht auf einer 32-Bit-Wortgrenze endest, fügt er zwischen der struct und dem uint32_t 2 Paddingbytes ein. Das gleiche passiert weiter unten noch einmal. In der Summe also 28 + 2 x 2 = 32.
Du mußt den Compiler anweisen, die Struktur ohne Alignment anzulegen, falls Du diese Einteilung unbedingt brauchst (z.B. weil Du Memorymapping oder I/O machen mußt).
-
Was meinst du mit, "wie es seien sollte"? Der Compiler darf Strukturen mit beliebigen Padding-Bytes auffüllen. Das hat den Sinn, dass der Zugriff auf die einzelnen Elemente schneller wird.
Wie man das deaktiviert hängt vom Compiler ab.
Schau dir mal beim GCC __attribute__ an. __attribute__((packed)) dürfte dich interessieren.