2011-12-24 61 views
1

可能重複:
A question about union in C對齊變量

假設下面的代碼:

#include <stdio.h> 

int main() 
{ 
    union a 
    { 
     int i; 
     char ch[2]; 
    }; 
    union a u; 
    u.ch[0]=3; 
    u.ch[1]=2; 
    printf("%d, %d, %d\n", u.ch[0], u.ch[1], u.i); 
    return 0; 
} 

我想知道爲什麼ch[0]ch[1]低量級工會地址。在堆棧中,如果我有一個小端字節,他們應該在更高階的地址。任何人都可以解釋工會的記憶表現嗎?

+1

此代碼的這種行爲是未定義的。請參閱http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c – 2011-12-24 15:44:13

+0

您無法從「union」的* both *成員讀取值。保羅的評論是試圖告訴你,這樣做會產生未定義的行爲。提出有關「爲什麼」的問題,您會發現某些未定義的行爲是荒謬的。 – 2011-12-24 16:06:07

+0

@CodyGray,你覺得呢?如果位模式是該成員類型的陷阱表示,則從另一個成員讀取的內容僅爲UB。由於'char'通常沒有陷阱表示,所以這當然不是問題。 (甚至可以避免完全不必使用'unsigned char'。) – 2011-12-24 16:18:04

回答

3

由於所有成員都位於union所佔用的內存塊的開始位置,因此union應該對齊,以便它的所有成員都對齊。

0

這就是工會的工作方式。它與永恆性無關。
每個工會會員在工會開始的​​地址開始,並儘可能多地需要。所以ch[0]將採取第一個地址。

Endianess只在整數類型佔用兩個或多個字節時纔有意義。然後,最重要的字節可以是第一個或最後一個。但在這裏你有兩個角色,第一個是第一個,第二個是第二個。