我在网上遇到了这个例子,我无法弄清楚它对我的生活是如何起作用的。
#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
,还是我遗漏了什么?
P.S。当我在调试中运行它时,a
和*pa
是2 ...
答案 0 :(得分:2)
更改const
- 值会产生未定义的行为,而“神秘”输出就是这种未定义的行为。
实际上,不必研究为什么未定义行为世界中的行为就像现在一样。但在你的情况下,它可能没有使用a
,因为你将它声明为const
,因此编译器“知道”该值并可能决定不访问该变量。
只是为了展示一些好奇的东西,试试:
int main()
{
volatile int const a = 1;
int* pa = (int*) &a;
*pa = 2;
printf("%p %d %p %d", (void*) &a, a, (void*) pa, *pa);
return 0;
}