2009-05-21 54 views
19

如果我有一個聯合,C標準保證聯合本身將對齊到最大元素的大小。聯合元素對齊

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

但它說什麼關於工會內部的各個工會元件排列?以下表達保證是真實的嗎?

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

提醒記住標準不會說'u.i&0xFF == uc [0]`或i的低位字節不能保證是c [0](字節順序) – Spudd86 2010-06-17 15:55:18

回答

23

的各元素的開始與聯合本身的地址對齊。

因此,您要求的表達式中的個別比較是真實的,但除非聯合位於地址0x0001處,否則整個表達式是錯誤的。

應用於以下比較刪除的文本:

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

修訂版本進行比較不同的指針類型 - 指針應被轉換爲空指針。


我被要求引用標準 - 或標識標準的部分。

C99 - 部分6.7.2.1結構和聯合說明符(第14段):

一個指向聯合對象,適當地轉換,指向每個成員(或如果一個件是一個位域,然後到它所在的單位),反之亦然。

+3

可以你參考標準的相關部分嗎? – 2009-05-21 05:19:45