【发布时间】:2018-03-23 03:41:17
【问题描述】:
我直接放代码了。
#include <stdio.h>
struct A
{
int a;
int b;
};
int main()
{
struct A test;
double *p = (double *)&(test.a);
*p = 5;
printf("variable a: %d\n", &test.a);
printf("variable b: %d\n", &test.b);
return 0;
}
我在centos7中运行这段代码,编译器是gcc4.8.5。而我的电脑使用little ending来存储。
如您所见,变量b 的内存将被覆盖,我预计a 是0x0000 0005 而b 是0x0000 0000。
但答案是:
variable a: 0
variable b: 1075052544
为什么变量a 是0x 0000 0000 而b 是0x4014 0000?
【问题讨论】:
-
这是未定义的行为。此外,
double5 对应于 64 位整数0x4014000000000000,因此您可能可以弄清楚发生了什么。提示:double可以大于int。 -
你得到了意想不到的结果,因为你对你的编译器撒了谎,它想出了一个办法来报复你。你告诉编译器
&(test.a)是一个double的地址,但它是一个整数的地址。 -
你可以调整优化设置并让你的编译器编译代码,结果也是else。
-
@Bathsheba 只是写在这里,输出与代码不匹配,所以,你为什么要推翻我的反对意见?!
-
该代码是一个严格的别名违规,因此是完全未定义的行为。对未定义行为的影响进行推理是毫无意义的。
标签: c pointers memory int double