鱼C论坛

 找回密码
 立即注册
查看: 2123|回复: 2

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

[复制链接]
发表于 2019-12-11 14:22:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

之后就很好理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
                        (int  a)                     (int  b)
看了存储之后,接下来分析程序的执行过程。
首先,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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 03:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表