關於聯合體union的詳細解釋

2021-06-18 07:40:03 字數 2151 閱讀 2481

1.概述

聯合體union的定義方式與結構體一樣,但是二者有根本區別。

在結構中各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在「聯合」中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。

2.聯合體長度

在the c programming language裡面講述union記憶體分配的原話是

1)聯合體就是乙個結構

2)聯合體的所有成員相對於基位址的偏移量為0

3)此結構空間要大到總夠容納最「寬」的成員

4)並且,其對其方式要適合於聯合體中所有型別的成員

我的理解可以概括為兩點:

1)聯合體的結構空間要足夠大,要等於最長的乙個結構變數的空間,但是這個最長的空間要滿足以下條件:

1.要大於等於最長的乙個結構變數的空間

2.並且要能夠整除其他結構變數的資料長度,即聯合體空間對其他成員的元型別要能夠整除(int a[5],其元型別為int,元型別長度為4),實際上就是要取乙個元型別的最小公倍數。

這兒舉例來說

[cpp]view plain

copy

union

fighter;   

這個結構體中,各個結構變數的空間分別為float   fuel_load; 佔4個位元組,char a[5];佔5個位元組,int   pallets;佔4個位元組。通過「3)此結構空間要大到總夠容納最「寬」的成員」這句話,我們可以認為是結構體的空間為5個位元組即可,但是「其對其方式要適合於聯合體中所有型別的成員」沒有滿足,對於這個問題,通過上面紅色字型部分可以解決。,因此聯合體空間為8.8可以整除 4(float、int長度)和1(char的長度),並且8大於陣列5.

再舉乙個例子有助於大家理解。

[cpp]view plain

copy

struct

aircraft   

;   

}fighter;   

sizeof(fighter) 是12 。int   wingspan; int   passengers;兩個int型 8個位元組。union中 3個都是4個位元組,因此union長度為4個位元組。 

3.記憶體分配

一句話:聯合體變數的各個成員都是從低位元組開始公用的。即:所有的成員都是從低位元組開始的。

我們先為整個union分配乙個空間,這個空間大小就是上面(2)記憶體分配中所講述的。

[cpp]view plain

copy

union

a;  

intmain(

void

)    

其記憶體如下圖所示。a.x[0] 處於低位元組,x[1]高位元組。當呼叫i這個成員變數的時候,其開始位址仍然是從起始位址開始,數4個位元組輸出。因此為 256 + 10 = 266

程式附上:

[cpp]view plain

copy

#include 

#include 

#include 

#if 0

typedef

union

datadata_t;  

intmain(

intargc ,

char

**argv)  

#endif

typedef

union

datadata_t;  

intmain(

intargc ,

char

**argv)    

4.附錄 各個資料型別的長度

type bytes

int  4

char 1

short int 2

bool 1

long 4

long long 8

float 4

double 8

long double 8

關於聯合體union的詳細解釋

1.概述 聯合體union的定義方式與結構體一樣,但是二者有根本區別。在結構中各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在 聯合 中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。2.聯合體長度 在the c programming language裡面...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...

聯合體union筆記

當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 4 其對齊方式要適合其中所有的成員 下面解釋這四條描述 由於聯合體中的所有成員是共享一段記憶體的,因此每個成員...