天天看點

關于聯合體union的詳細解釋

2.聯合體長度

在The C Programming Language裡面講述union記憶體配置設定的原話是

1)聯合體就是一個結構

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

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

4)并且,其對其方式要适合于聯合體中所有類型的成員

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

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

     1.要大于等于最長的一個結構變量的空間

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

這兒舉例來說

[cpp]

view plain copy
  1. union    
  2. {  
  3.     float   fuel_load;  
  4.     char a[5]; 
  5.     int   pallets;  
  6. }fighter;  

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

再舉一個例子有助于大家了解。

  1. struct   aircraft  
  2. int   wingspan;  
  3. int   passengers;  
  4. float   fuel_load;  
  5. float   bomb_load;  
  6. int   pallets;  
  7. };  

sizeof(fighter) 是12 。int   wingspan; int   passengers;兩個int型 8個位元組。union中 3個都是4個位元組,是以union長度為4個位元組,一共是4*3 =12位元組。

3.記憶體配置設定

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

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

  1. union { 
  2.       int i; 
  3.       char x[2]; 
  4. }a; 
  5. int main(void) 
  6.    a.x[0] = 10; 
  7.    a.x[1] = 1; 
  8.    printf("%d\n",a.i); 
  9.    return 0; 
其記憶體如下圖所示。a.x[0] 處于低位元組,x[1]高位元組。當調用i這個成員變量的時候,其開始位址仍然是從起始位址開始,數4個位元組輸出。是以為 256 + 10 = 266
關于聯合體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

繼續閱讀