1.概述
聯合體union的定義方式與結構體一樣,但是二者有根本區別。2.聯合體長度在結構中各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在「聯合」中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。
在the c programming language裡面講述union記憶體分配的原話是3.記憶體分配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個位元組。
一句話:聯合體變數的各個成員都是從低位元組開始公用的。即:所有的成員都是從低位元組開始的。4.附錄 各個資料型別的長度我們先為整個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)
type bytesint 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 其對齊方式要適合其中所有的成員 下面解釋這四條描述 由於聯合體中的所有成員是共享一段記憶體的,因此每個成員...