C語言中的聯合體union所佔記憶體方式

2022-06-07 07:00:12 字數 960 閱讀 4168

當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體(union)。在c programming language 一書中對於聯合體是這麼描述的:

1)聯合體是乙個結構;

2)它的所有成員相對於基位址的偏移量都為0;

3)此結構空間要大到足夠容納最"寬"的成員;

4)其對齊方式要適合其中所有的成員;

下面解釋這四條描述:

由於聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於於聯合體變數的基位址的偏移量為0,即所有成員的首位址都是一樣的。

為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。對於這句「對齊方式要適合其中所有的成員」是指其必須符合所有成員的自身對齊方式。

示例:

union u

;

上面的程式中的,

s佔9位元組,n佔4位元組,d佔8位元組,因此其至少需9位元組的空間。

然而其實際大小並不是9,用運算子sizeof測試其大小為16.

這是因為這裡存在位元組對齊的問題,9既不能被4整除,也不能被8整除。因此補充位元組到16,這樣就符合所有成員的自身對齊了。

從這裡可以看出聯合體所佔的空間不僅取決於最寬成員,還跟所有成員有關係,即其大小必須滿足兩個條件:

1)大小足夠容納最寬的成員;

2)大小能被其包含的所有基本資料型別的大小所整除。

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記憶...