结构体强转联合体笔记

来源:互联网 发布:php登录简单页面代码 编辑:程序博客网 时间:2024/06/06 02:05

结构体强制转换为联合体笔记
测试代码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小的话,就会被截断

1 0
原创粉丝点击