2009-05-21 18 views
19

Jeśli mam związek, standard C gwarantuje, że sam związek będzie dopasowany do rozmiaru największego elementu.Wyrównanie elementu Unii

union U { 
    long l; 
    int i; 
    short s; 
    char c[2]; 
} u; 

Ale co mówi o wyrównaniu poszczególnych elementów związku w ramach związku? Czy poniższe wyrażenie jest gwarantowane?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0]) 
+6

przypomnieniem, aby pamiętać, co norma nie powiedzieć 'u.i & 0xFF == uc [0]' lub niski bajt kolejność nie jest gwarancją c [0] (bajt) – Spudd86

Odpowiedz

23

Początek każdego elementu jest dopasowany do adresu samego związku.

, więc poszczególne porównania wyrażenia, o które pytasz, są prawdziwe, ale całe wyrażenie jest fałszywe, chyba że związek znajduje się pod adresem 0x0001.

Usunięty tekst stosuje się do następujących porównaniach:

&u.l == &u.i == &u.s == &u.c[0] 

Zmieniona wersja porównuje różne typy Pointer - Wskaźniki powinny być oddane do pustych wskaźników.


poproszono mnie zacytować standard - lub zidentyfikować odcinek standardzie.

C99 - sekcja 6.7.2.1 Struktura i związków Specyfikatory (akapit 14)

wskaźnik do obiektu związków, odpowiednio przekształcone, wskazuje na każdym z jego ramy (lub, jeśli element jest bitfield, następnie do jednostki, w której się znajduje) i na odwrót.

+3

Can odwołujesz się do odpowiedniej części normy? –