sizeof(struct)和sizeof(union)

来源:互联网 发布:versions for mac 1.4 编辑:程序博客网 时间:2024/05/16 06:34

一、union共用体(联合)

共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中元类型(如数组,取其类型的数据长度)最大的变量长度的整数倍,且要大于等于其最大成员所占的存储空间。
[cpp] view plaincopyprint?
  1. union foo  
  2. {  
  3. char s[10];  
  4. int i;  
  5. }  
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
[cpp] view plaincopyprint?
  1. union   mm{    
  2.   char   a;//元长度1        1  
  3.   int   b[5];//元长度4     20  
  4.   double   c;//元长度8     8  
  5.   int   d[3];              12  
  6.   };    
所以sizeof(mm)=8*3=24;
当在共用体中包含结构体时,如下:
[cpp] view plaincopyprint?
  1. struct inner  
  2. {  
  3.    char      c1;  
  4.    double   d;  
  5.    char     c2;  
  6.   };  
  7.   
  8. union data4  
  9. {  
  10.      struct   inner t1;  
  11.       int           i;  
  12.       char        c;  
  13.     };  
由于data4共用体中有一个inner结构体,所以最大的基本数据类型为double,因此以8字节对齐。共用体的存储长度取决于t1,而t1长度为24,因此sizeof(uniondata4)的值为24.

当在结构体中包含共用体时,共用体在结构体里的对齐地址为共用体本身内部所对齐位数,如下:
[cpp] view plaincopyprint?
  1. typedef union{  
  2.     long i;  
  3.     int k[5];  
  4.     char c;  
  5. }DATE;  
  6. struct data{  
  7.     int cat;  
  8.     char cc;  
  9.     DATE cow;  
  10.     char a[6];  
  11. };  
sizeof(DATE)=20, 而在结构体中中是4+1+3(补齐4对齐)+20+6+2(补齐4对齐)=36;


二、两者的区别

1. 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。
2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。
0 0
原创粉丝点击