结构体强转联合体笔记

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章