union需要注意的點

在聯合體中,各成員共享一段內存空間, 一個聯合變量的長度等於各成員中最長的長度。應該說明的是, 這裏所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。

一個聯合體類型必須經過定義之後, 才能使用它,才能把一個變量聲明定義爲該聯合體類型。

 

4.聯合體union所佔內存空間大小:

前邊說了,首先,union的首地址是固定的,那麼,union到底總共有多大?根據一些小常識,做個不嚴謹不高深的基礎版驗證吧。

根據:分配棧空間的時候內存地址基本上是連續的,至少同類型能保證在一起,連續就說明,我如果弄三個結構體出來,他們三個地址應該連着,看一下三個地址的間隔就知道了。

  1. #include<stdio.h>  
  2. union sizeTest{  
  3.         int a;  
  4.         double b;  
  5. };  
  6. main(){  //main也是一個函數。
  7.         union sizeTest unionA;  
  8.         union sizeTest unionB;  
  9.         union sizeTest unionC;  
  10.   
  11.         printf("the initial address of unionA is %p\n",&unionA);  
  12.         printf("the initial address of unionB is %p\n",&unionB);  
  13.         printf("the initial address of unionC is %p\n",&unionC);  
  14. }  


打印,可以看到結果:

the initial address of unionA is 0xbf9b8df8
the initial address of unionB is 0xbf9b8e00
the initial address of unionC is 0xbf9b8e08

很容易看出,8,0,8,這間隔是8字節,按double走的。

怕不保險,再改一下,把int改成數組,其他不變:

  1. union sizeTest{  
  2.         int a[10];  
  3.         double b;  
  4. };  


打印

the initial address of unionA is 0xbfbb7738
the initial address of unionB is 0xbfbb7760
the initial address of unionC is 0xbfbb7788

88-60=28
60-38=28
算錯了?我說的可是16進制0x。那麼0x28就是40個字節,正好是數組a的大小。

似乎忘了一個功能——sizeof()

用sizeof直接看,就知道union的大小了

  1.         printf("the sizeof   of unionA is %d\n",sizeof(unionA));  
  2.         printf("the sizeof   of unionB is %d\n",sizeof(unionB));  
  3.         printf("the sizeof   of unionC is %d\n",sizeof(unionC));  
  4.         printf("the sizeof   of union is %d\n",sizeof(union sizeTest));  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章