一、union共用体(联合)
共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中元类型(如数组,取其类型的数据长度)最大的变量长度的整数倍,且要大于等于其最大成员所占的存储空间。
- union foo
- {
- char s[10];
- int i;
- }
union foo
{
char s[10];
int i;
}
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
- union mm{
- char a;//元长度1 1
- int b[5];//元长度4 20
- double c;//元长度8 8
- int d[3]; 12
- };
union mm{
char a;//元长度1 1
int b[5];//元长度4 20
double c;//元长度8 8
int d[3]; 12
};
所以sizeof(mm)=8*3=24;
当在共用体中包含结构体时,如下:
- struct inner
- {
- char c1;
- double d;
- char c2;
- };
- union data4
- {
- struct inner t1;
- int i;
- char c;
- };
struct inner
{
char c1;
double d;
char c2;
};
union data4
{
struct inner t1;
int i;
char c;
};
由于data4共用体中有一个inner结构体,所以最大的基本数据类型为double,因此以8字节对齐。共用体的存储长度取决于t1,而t1长度为24,因此sizeof(uniondata4)的值为24.
当在结构体 中包含 共用体 时,共用体在结构体里的对齐地址为共用体本身内部所对齐位数,如下:
- typedef union{
- long i;
- int k[5];
- char c;
- }DATE;
- struct data{
- int cat;
- char cc;
- DATE cow;
- char a[6];
- };
typedef union{
long i;
int k[5];
char c;
}DATE;
struct data{
int cat;
char cc;
DATE cow;
char a[6];
};
sizeof(DATE)=20, 而在结构体中中是4+1+3(补齐4对齐)+20+6+2(补齐4对齐)=36;
1. 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。
2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。