联合(共用体)
前面分别介绍了结构体,位段和枚举类型,今天我们来介绍最后一个自定义类型——联合(又叫共用体)。
目录
一、定义
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
根据上述定义我们可知,联合中的所有成员都是从相同的内存地址开始。
下面就是一个例子
union Un{
char c;
int i;
};
它的内存示意图应该如下:
二、联合的大小计算
由于联合的存储方式十分特殊,所以我们在计算联合的大小的时候有两个特点。
1、联合的大小至少是最大成员的大小。
2、当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例如:
union Un1{
char c[5];
int i;
};
union Un2{
short c[7];
int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
根据上述计算方式,
Un1的大小应该为8;Un2的大小应该为16。
三、根据联合判断大小端。
我们知道联合中所有成员都是从相同的内存地址开始存储的,这意味这我们改变某一个成员的值时可能会改变其他成员的值,根据这个特点我们可以判断编译器字节序是大端还是小端的。
代码如下:
#include <stdio.h>
union Un{
char c;
int i;
};
int main(){
union Un un;
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
若是大端,则是数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,那么输出的结果应该为55223344;
若是小端,则是数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,那么输出的结果应该为11223344。
下面验证结果:
可见在VS中字节是按大端的方式来存储的。