首页 > union在内存中的表现形式?

union在内存中的表现形式?

#include <stdio.h>

typedef union{
    int int_value;
} union_value;

int main(void){
    int i=3;
    int *ip=&i;

    printf("%d\n",((union_value *)ip)->int_value);
    return 0;
}

上面这段程序,我应该如何理解?union_value在内存中的表现形式难道和int一样?


没错,一样一样的。。。没有任何区别,都是四个字节嘛

内存只是存储数据的地方,至于数据是什么类型,是人控制的,编译器再根据人的意志生成对应指令


union占用的内存是它其中包含的最大的那个
比如下面的U占用的内存和short一样

union U {
    char c;
    short si;
};
/* sizeof(U) == 2 */

你的代码里只有一个int所以它占用的内存和int一样,所以强制转换后的结果也是正确的


作业吧?真实的代码里没有这么折腾的。
C语言的语法(强制类型转换),只是语法上的限制(这种限制是为了方便写代码和不会出现不期望的错误)

typedef union{
    int int_value;
} union_value;

这个只是说 union_value类型占了4个字节(32位系统),原因见wangdai的回答。然后int_vallue相对于这个变量的起始偏移为0.

那么,现在 ip指向了某个内存 ip->int_value(不考虑强制类型转换)就是相当于*(ip+0),为什么是+0,就是编译器根据typedef推导出来的。

【热门文章】
【热门文章】