变量同时有两个值?

时间:2017-06-30 20:43:49

标签: c++ pointers

我在网上遇到了这个例子,我无法弄清楚它对我的生活是如何起作用的。

#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 ...

1 个答案:

答案 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;
}