1.概述
聯合體union的定義方式與結構體一樣,但是二者有根本區別。
在結構中各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在「聯合」中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。
2.聯合體長度
在the c programming language裡面講述union記憶體分配的原話是
1)聯合體就是乙個結構
2)聯合體的所有成員相對於基位址的偏移量為0
3)此結構空間要大到總夠容納最「寬」的成員
4)並且,其對其方式要適合於聯合體中所有型別的成員
我的理解可以概括為兩點:
1)聯合體的結構空間要足夠大,要等於最長的乙個結構變數的空間,但是這個最長的空間要滿足以下條件:
1.要大於等於最長的乙個結構變數的空間
2.並且要能夠整除其他結構變數的資料長度,即聯合體空間對其他成員的元型別要能夠整除(int a[5],其元型別為int,元型別長度為4),實際上就是要取乙個元型別的最小公倍數。
這兒舉例來說
union
fighter;
這個結構體中,各個結構變數的空間分別為float fuel_load; 佔4個位元組,char a[5];佔5個位元組,int pallets;佔4個位元組。通過「3)此結構空間要大到總夠容納最「寬」的成員」這句話,我們可以認為是結構體的空間為5個位元組即可,但是「其對其方式要適合於聯合體中所有型別的成員」沒有滿足,對於這個問題,通過上面紅色字型部分可以解決。,因此聯合體空間為88可以整除 4(float、int長度)和1(char的長度),並且8大於陣列5.
再舉乙個例子有助於大家理解。
struct aircraft
;}fighter;
sizeof(fighter) 是12 。int wingspan; int passengers;兩個int型 8個位元組。union中 3個都是4個位元組,因此union長度為4個位元組。
3.記憶體分配
一句話:聯合體變數的各個成員都是從低位元組開始公用的。即:所有的成員都是從低位元組開始的。
我們先為整個union分配乙個空間,這個空間大小就是上面(2)記憶體分配中所講述的。
union
a;int
main
(void
)
其記憶體如下圖所示。a.x[0] 處於低位元組,x[1]高位元組。當呼叫i這個成員變數的時候,其開始位址仍然是從起始位址開始,數4個位元組輸出。因此為 256 + 10 = 266
程式:
#include
#include
#include
#if 0
typedef
union datadata_t;
intmain
(int argc ,
char
**ar**)
#endif
typedef
union datadata_t;
intmain
(int argc ,
char
**ar**)
union聯合體使用詳解
1.聯合體 聯合體 union 與結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在聯合體中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。應該說 明的是,這裡所謂的共享不是指把多個成員同...
union聯合體使用詳解
1.聯合體 聯合體 union 與結構體 struct 有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間,乙個結構變數的總長度是各成員長度之和。而在聯合體中,各成員共享一段記憶體空間,乙個聯合變數的長度等於各成員中最長的長度。應該說 明的是,這裡所謂的共享不是指把多個成員同...
union聯合體學習
union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...