【发布时间】:2017-06-30 20:43:49
【问题描述】:
我在网上遇到了这个例子,但我不知道它是如何影响我的生活的。
#include <iostream>
int main()
{
int const a = 1;
int* pa = (int*) &a;
*pa = 2;
printf("%p %d %p %d", (void*) &a, a, (void*) pa, *pa);
return 0;
}
当我在我的机器上编译它时,我得到:
0xffffcc04 1 0xffffcc04 2
这意味着内存位置0xffffcc04同时具有值1和2???编译器优化了a,还是我遗漏了什么?
附:当我在调试中运行它时,a 和 *pa 是 2...
【问题讨论】:
-
欢迎来到未定义行为的奇妙世界!你不能那样做。
-
代码只是有一个错误。如果你修复了这个错误,谜团就会消失。
-
当你打开警告时,这段代码输出了多少警告?你总是在编译时出现警告?
-
编译器正在优化
a。由于您将其声明为const,它知道它可以在任何看到它的地方将a替换为1。 -
对编译器撒谎是不值得的。