c ++,两个指向同一位置的指针如何保持不同的值

时间:2014-12-07 03:43:08

标签: c++ c const compiler-optimization

有人向我展示了以下代码段并询问它应该输出什么

#include <iostream>
using namespace std;

int main() {
    const int value = 10;
    int* p = (int*)&value;
    *p = 20;

    cout << value << " " << *p << endl
        << &value << " " << p << endl;

    return 0;
}

正如您所看到的,有一个常量value为10,并且指针p指向值的地址,然后指向的地址获得不同的值。

我希望程序能够打印20 20 but it actually prints 10 20.
它还表明这两个贵重物品具有相同的地址。有人可以解释幕后发生的事情吗?

1 个答案:

答案 0 :(得分:3)

未定义的行为和优化编译器。编译器知道来自value的声明,value的值在格式良好的程序中永远不会改变,因此它优化了位其中value的值将被检查,并且只获取它所知道的值value

至于地址,您永远不会使用p的地址,并且p&value的地址相同并不奇怪,因为您之前已将其分配了几行。