在聯合體中,各成員共享一段內存空間, 一個聯合變量的長度等於各成員中最長的長度。應該說明的是, 這裏所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。
一個聯合體類型必須經過定義之後, 才能使用它,才能把一個變量聲明定義爲該聯合體類型。
4.聯合體union所佔內存空間大小:
前邊說了,首先,union的首地址是固定的,那麼,union到底總共有多大?根據一些小常識,做個不嚴謹不高深的基礎版驗證吧。
根據:分配棧空間的時候內存地址基本上是連續的,至少同類型能保證在一起,連續就說明,我如果弄三個結構體出來,他們三個地址應該連着,看一下三個地址的間隔就知道了。
- #include<stdio.h>
- union sizeTest{
- int a;
- double b;
- };
- main(){ //main也是一個函數。
- union sizeTest unionA;
- union sizeTest unionB;
- union sizeTest unionC;
- printf("the initial address of unionA is %p\n",&unionA);
- printf("the initial address of unionB is %p\n",&unionB);
- printf("the initial address of unionC is %p\n",&unionC);
- }
打印,可以看到結果:
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改成數組,其他不變:
- union sizeTest{
- int a[10];
- double b;
- };
打印
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的大小了
- printf("the sizeof of unionA is %d\n",sizeof(unionA));
- printf("the sizeof of unionB is %d\n",sizeof(unionB));
- printf("the sizeof of unionC is %d\n",sizeof(unionC));
- printf("the sizeof of union is %d\n",sizeof(union sizeTest));