C語言聯合(union)的定義和初始化

2020-07-16 10:04:23
當定義結構物件時,如果沒有顯式地初始化它們,則會採用一般初始化規則:如果該結構物件屬於動態儲存型別,那麼其成員具有不確定的初始值。另一方面,如果結構物件具有靜態儲存週期,那麼其非指標成員初始值是 0,其指標成員初始值是空指標。

不同於結構成員——它們在結構中都具有單獨的記憶體位置,聯合成員則共用同一個記憶體位置。也就是說,聯合中的所有成員都是從相同的記憶體地址開始。因此,可以定義一個擁有許多成員的聯合,但是同一時刻只能有一個成員允許含有一個值。聯合讓程式設計師可以方便地通過不同方式使用同一個記憶體位置。

定義聯合(union)

聯合的定義方式與結構是一樣的,只是把關鍵字 struct 改成 union

union [標籤名稱]{成員宣告列表};


下面的例子定義了一個名為Data的聯合型別,它有 3 個成員:i、x 和 str:
union Data { int i; double x; char str[16]; };

這種型別的物件可以儲存一個整數、一個浮點數或一個短字串。下面的宣告定義了一個 union Data 型別的物件 var 和一個 unionData 型別的陣列 myData,它有 100 個元素(聯合的空間大小為它最大成員的空間大小):
union Data var, myData[100];

如果想獲得聯合的空間大小,可以使用 sizeof 運算子。對上例來說,sizeof(var)會返回 16,而 sizeof(myData)則返回 1600。

如圖 1 所示,聯合中所有成員都是從記憶體中同一個地址開始的。


圖 1