联合体: 和结构体形式差不多,都是包含一系列的成员。但是联合体相较结构体来说有一点特殊就是:联合体的所有成员共用一快内存空间。
//联合体的声明
union Un{
char c;
int i;
};
union Un un;//定义一个联合体变量
第一个成员变量的地址跟联合体的地址一样,这点跟结构体类似。
联合体的特点:成员共用一个内存空间,这样联合体的大小,至少是最大成员的大小。
union Un{
char a;
int b;
}un;
printf("%d\n",sizeof(un));
从图片我们可以看到联合体的总大小为4。这是因为联合体的成员共用一个内存空间,而联合体的大小就是联合体里面的最大成员的大小。而这个最大成员就是b,大小为4个字节,所以结构体的大小就为4。
这个知识点在面试中也会出题,如:
union Un{
char a;
int b;
}un;
un.a = 0x11223344;
un.b = 0x55;
printf("%x\n",un.i);
算这道题之前我们首先要知道计算机在内存中是怎样存储的?也就是按大端还是小端存储的?所以我们要先了解计算机的大小端存储,我们用联合体的知识写一下这个代码。
int IsLittleEnd(){
union Un{
char a;
int b;
}un;
un.b = 0x1;
if(un.a == 0x1){
return 1;
}else{
return 0;
}
}
一般计算机是按小端字节序来存储的,所以我们来看上面这个题。
联合体大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
union Un {
char a[10];
int b;
}un;
printf("%d\n", sizeof(un));
在这里,联合体的最大成员是一个数组,大小为10个字节。最大对齐数为4(成员b的对齐数),所以联合体的总大小就要为4的整数倍。而10不是4的整数倍,所以就要再补两个字节凑成4的整数倍,所以结果就为12。