鳗鱼可好吃 发表于 2021-12-16 20:10:22

帮忙分析一下代码

# 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-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));
    }
    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
$

人造人 发表于 2021-12-16 20:20:19

为什么是 10和20,而不是 5和20

鳗鱼可好吃 发表于 2021-12-16 20:26:36

人造人 发表于 2021-12-16 20:20
为什么是 10和20,而不是 5和20

大佬,我看不懂&#128547;&#128547;&#128547;&#128547;

jhq999 发表于 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++里的引用

如来神掌 发表于 2021-12-17 17:39:19

本帖最后由 如来神掌 于 2021-12-17 17:40 编辑

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

番杰 发表于 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语言共用体

鳗鱼可好吃 发表于 2021-12-18 11:13:12

番杰 发表于 2021-12-17 17:48
union(共用体)定义的数据用的都是同一个内存空间,

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

大佬又是你,爱了爱了

番杰 发表于 2021-12-18 14:34:04

鳗鱼可好吃 发表于 2021-12-18 11:13
大佬又是你,爱了爱了

嘿嘿,一起努力学习{:10_297:}
页: [1]
查看完整版本: 帮忙分析一下代码