陈长 发表于 2019-12-11 14:22:55

能否解释该程序,小白求助

#include <stdio.h>
int main()
{
        union eg1
        {int c;
        int d;
        struct{
                int a;
                int b;
        }out;
        }e;
        e.c=1;e.d=2;
        e.out.a=e.c*e.d;
        e.out.b=e.c+e.d;
        printf("%d\t%d\n",e.out.a,e.out.b);
        return 0;
}

Croper 发表于 2019-12-11 22:51:45

只要理解union作为联合体,其“成员变量"的储存方式就简单了。
union设计来时为了节约空间,其”成员变量"储存位置相对于基地址的偏移都为0,
因此,在此例中,c,d以及out.a其储存位置完全相同,会相互覆盖。
而out.b相对于基地址的偏移为4,相对独立。

之后就很好理解了。

sunrise085 发表于 2019-12-12 16:20:21

union和struct是两种不同的类型。union是联合体,所有成员变量存储位置一样,struct是结构体,每个成员变量单独存储。
我们以你这个程序为例,看一下这几个变量的存储。假设你的环境中int是两个字节。
变量名      第一字节    第二字节    第三字节   第四字节
int      c: xxxx xxxx   xxxx xxxx
int      d:xxxx xxxx   xxxx xxxx
struct out:xxxx xxxx   xxxx xxxx   xxxx xxxx   xxxx xxxx
                        (inta)                     (intb)
看了存储之后,接下来分析程序的执行过程。
首先,e.c=1,第一个int空间存放1;
然后,e.d=2,第一个int空间被修改为2;
之后, e.out.a=e.c*e.d,第一个int空间被修改为4;
最后, e.out.b=e.c+e.d,第二个int空间存放8。
所以程序执行结果是:4    8
页: [1]
查看完整版本: 能否解释该程序,小白求助