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));  

 

 

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