帮忙分析一下代码
# 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,能细讲一下吗 $ 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
$ 为什么是 10和20,而不是 5和20
人造人 发表于 2021-12-16 20:20
为什么是 10和20,而不是 5和20
大佬,我看不懂😣😣😣😣 本帖最后由 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:40 编辑
5#楼大佬说对了,共用体是一种元素共用存储空间的特殊封装: union(共用体)定义的数据用的都是同一个内存空间,
简单点说,就是程序中的exa占用的内存空间只有2个int长度,
它的长度为共用体内最长的数据,也就是out这个结构体,
再简单点说就是e.c 和e.out.a共同占用一个int长度,e.d和e.out.b 共同占用一个int长度,
所以在最后打印的时候,就会出现5和20的结果。
你可以参考这个文章:C语言共用体 番杰 发表于 2021-12-17 17:48
union(共用体)定义的数据用的都是同一个内存空间,
简单点说,就是程序中的exa占用的内存空间只有2个i ...
大佬又是你,爱了爱了 鳗鱼可好吃 发表于 2021-12-18 11:13
大佬又是你,爱了爱了
嘿嘿,一起努力学习{:10_297:}
页:
[1]