聯合體union記憶體分配詳解

2021-10-10 08:05:16 字數 1720 閱讀 2502

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記憶體空間的分配是粗放的,不管...