结构体强制转换为联合体笔记
测试代码1
int main()
{
//首先创建一个联合体,联合体内有两个结构体
typedef union
{
struct
{
unsigned int i_ia = 0;
char buffer[32] = "a";
} va_4byte;
struct
{
unsigned int i_ib = 2;
char bufferb[32] = "b";
unsigned int i_ic = 2;
} va_compress;
} union_test;
//测试联合体的大小:为40个字节
int i_size = sizeof(union_test);
//打印联合体大小
printf("%d \n", i_size);
//定义一个结构体,结构体大小为36个字节
struct MyStruct
{
int abx = 1;
char m_buff[32] = "hello";
} m_struct;
struct MyStruct * p = &m_struct;
//测试结果
printf("ia = %d \n",((union_test*)(p))->va_4byte.i_ia);//1
printf("ia = %s \n", ((union_test*)(p))->va_4byte.buffer);//hello
printf("%d\n", ((union_test*)(p))->va_compress.i_ib);//1
printf("%d\n", ((union_test*)(p))->va_compress.i_ic);//-858993460
printf("%s\n", ((union_test*)(p))->va_compress.bufferb);//hello
强转后结果分析
- 联合体具有40个字节大小,结构体只有32个字节
当测试ia的时候,结构体32个字节,正好覆盖union的前32个字节,所以第一个结构体能够打印出正确信息
-当测试ib的时候,结构体32个字节,正好覆盖union的前32个字节,后4个字节没有覆盖,所以打印出乱乱的东西。测试代码2
int main()
{
typedef union
{
struct
{
unsigned int i_ia = 0;
char buffer[32] = "a";
//不相同的地方*****************
struct
{
unsigned int i_ib = 2;
unsigned int i_ic = 2;
char bufferb[32] = "b";
} va_compress;
} union_test;
//**************************
//测试联合体的大小:为40个字节
int i_size = sizeof(union_test);
printf("%d \n", i_size);
struct MyStruct
{
int abx = 1;
char m_buff[32] = "hello";
} m_struct;
struct MyStruct * p = &m_struct;
//测试结果
printf("ia = %d \n",((union_test*)(p))->va_4byte.i_ia);//1
printf("ia = %s \n", ((union_test*)(p))->va_4byte.buffer);//hello
printf("%d\n", ((union_test*)(p))->va_compress.i_ib);//1
printf("%d\n", ((union_test*)(p))->va_compress.i_ic);//181043167
printf("%s\n", ((union_test*)(p))->va_compress.bufferb);//o
// return 0;
}
测试结果2
- ia的数据跟原来的一样
- ib的记录跟原来一样
- ic的记录变为乱码
bufferb的记录,只有一个o,因为前4个字节被赋值给ib了。
综上所述:
struct强转为union的时候,会从头开始覆盖,unicon多出来的部分不进行覆盖。
如果union比struct小的话,就会被截断