鱼C论坛

 找回密码
 立即注册
查看: 794|回复: 8

[已解决]帮忙分析一下代码

[复制链接]
发表于 2021-12-16 20:10:22 | 显示全部楼层 |阅读模式

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

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

x
# include <stdio.h>
int main()
{
        union exa {
                struct {        int a;       
                                int b;
                        }out;
                int c;
                int d;
                        }e;
        e.out.a = 10;
        e.out.b = 20;
        e.c = 2;
        e.d = 5;
        printf("%d,%d\n",e.out.a,e.out.b);
        return 0;

}
这个代码为什么运行出来时5和20,而不是10和20,能细讲一下吗
最佳答案
2021-12-17 17:48:04
union(共用体)定义的数据用的都是同一个内存空间,

简单点说,就是程序中的exa占用的内存空间只有2个int长度,
它的长度为共用体内最长的数据,也就是out这个结构体,

再简单点说就是e.c 和e.out.a共同占用一个int长度,e.d和e.out.b 共同占用一个int长度,
所以在最后打印的时候,就会出现5和20的结果。

你可以参考这个文章:C语言共用体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-16 20:16:22 | 显示全部楼层
$ cat main.c
#include <stdio.h>

void output(const void *ptr, size_t size) {
    for(size_t i = 0; i < size; ++i) {
        printf("%.2x ", ((unsigned char *)ptr)[i]);
    }
    puts("");
}

int main() {
    union exa {
        struct {
            int a;
            int b;
        } out;
        int c;
        int d;
    } e;
    output(&e, sizeof(e));
    e.out.a = 10;
    output(&e, sizeof(e));
    e.out.b = 20;
    output(&e, sizeof(e));
    e.c = 2;
    output(&e, sizeof(e));
    e.d = 5;
    output(&e, sizeof(e));
    puts("");
    printf("%d,%d\n", e.out.a, e.out.b);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
78 f1 2d 29 ff 7f 00 00
0a 00 00 00 ff 7f 00 00
0a 00 00 00 14 00 00 00
02 00 00 00 14 00 00 00
05 00 00 00 14 00 00 00

5,20
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2021-12-16 20:20:19 | 显示全部楼层
为什么是 10和20,而不是 5和20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 20:26:36 | 显示全部楼层
人造人 发表于 2021-12-16 20:20
为什么是 10和20,而不是 5和20

大佬,我看不懂&#128547;&#128547;&#128547;&#128547;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-16 21:18:38 | 显示全部楼层
本帖最后由 jhq999 于 2021-12-16 21:22 编辑

代码里的联合声明
union exa {
                struct {        int a;       
                                int b;
                        }out;
                int c;
                int d;
                        }e;
//exa.out.a=exa.c=exa.d它们仨实际上是同一变量,只不过名字不一样,像C++里的引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-17 17:39:19 | 显示全部楼层
本帖最后由 如来神掌 于 2021-12-17 17:40 编辑

5#楼大佬说对了,共用体是一种元素共用存储空间的特殊封装:

共用体的

共用体的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-17 17:48:04 | 显示全部楼层    本楼为最佳答案   
union(共用体)定义的数据用的都是同一个内存空间,

简单点说,就是程序中的exa占用的内存空间只有2个int长度,
它的长度为共用体内最长的数据,也就是out这个结构体,

再简单点说就是e.c 和e.out.a共同占用一个int长度,e.d和e.out.b 共同占用一个int长度,
所以在最后打印的时候,就会出现5和20的结果。

你可以参考这个文章:C语言共用体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-18 11:13:12 | 显示全部楼层
番杰 发表于 2021-12-17 17:48
union(共用体)定义的数据用的都是同一个内存空间,

简单点说,就是程序中的exa占用的内存空间只有2个i ...

大佬又是你,爱了爱了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-18 14:34:04 | 显示全部楼层
鳗鱼可好吃 发表于 2021-12-18 11:13
大佬又是你,爱了爱了

嘿嘿,一起努力学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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