2.聯合體長度
在The C Programming Language裡面講述union記憶體配置設定的原話是
1)聯合體就是一個結構
2)聯合體的所有成員相對于基位址的偏移量為0
3)此結構空間要大到總夠容納最“寬”的成員
4)并且,其對其方式要适合于聯合體中所有類型的成員
我的了解可以概括為兩點:
1)聯合體的結構空間要足夠大,要等于最長的一個結構變量的空間,但是這個最長的空間要滿足以下條件:
1.要大于等于最長的一個結構變量的空間
2.并且要能夠整除其他結構變量的資料長度,即聯合體空間對其他成員的元類型要能夠整除(int a[5],其元類型為int,元類型長度為4),實際上就是要取一個元類型的最小公倍數。
這兒舉例來說
[cpp]
view plain copy
- union
- {
- float fuel_load;
- char a[5];
- int pallets;
- }fighter;
這個結構體中,各個結構變量的空間分别為float fuel_load; 占4個位元組,char a[5];占5個位元組,int pallets;占4個位元組。通過“3)此結構空間要大到總夠容納最“寬”的成員”這句話,我們可以認為是結構體的空間為5個位元組即可,但是“其對其方式要适合于聯合體中所有類型的成員”沒有滿足,對于這個問題,通過上面紅色字型部分可以解決。,是以聯合體空間為8.8可以整除 4(float、int長度)和1(char的長度),并且8大于數組5.
再舉一個例子有助于大家了解。
- struct aircraft
- int wingspan;
- int passengers;
- float fuel_load;
- float bomb_load;
- int pallets;
- };
sizeof(fighter) 是12 。int wingspan; int passengers;兩個int型 8個位元組。union中 3個都是4個位元組,是以union長度為4個位元組,一共是4*3 =12位元組。
3.記憶體配置設定
一句話:聯合體變量的各個成員都是從低位元組開始公用的。即:所有的成員都是從低位元組開始的。
我們先為整個union配置設定一個空間,這個空間大小就是上面(2)記憶體配置設定中所講述的。
其記憶體如下圖所示。a.x[0] 處于低位元組,x[1]高位元組。當調用i這個成員變量的時候,其開始位址仍然是從起始位址開始,數4個位元組輸出。是以為 256 + 10 = 266
- union {
- int i;
- char x[2];
- }a;
- int main(void)
- {
- a.x[0] = 10;
- a.x[1] = 1;
- printf("%d\n",a.i);
- return 0;
- }
![]()
關于聯合體union的詳細解釋 4.附錄 各個資料類型的長度
type bytes
int 4
char 1
short int 2
bool 1
long 4
long long 8
float 4
double 8
long double 8