指针指向const。指针发生了变化,但const没有变化

时间:2016-01-13 12:46:30

标签: c++

我有以下代码:

int main(void) {
    const int a = 2;
    int *p = (int *)&a;
    ++*p;
    cout << a << endl << *p << endl;
    cout << &a << endl << p << endl;

    return 0;
}

指针指向const int a,但是当我更改*指针时。 *p = 3 a = 2;
而p和a具有相同的地址 我不知道它是如何创造这个结果的。 任何人都可以为我解释。谢谢!

2 个答案:

答案 0 :(得分:6)

不允许修改const对象。修改const对象(通过非const指针)具有未定义的行为。 UB意味着任何事情都可能发生。具有未定义的行为是程序员的错误。

虽然对UB的理由几乎没有意义,但在这种情况下观察到的行为可能是由于constant folding

答案 1 :(得分:2)

答案是优化。更确切地说,不断传播。由于a被声明为常量并初始化为2,因此编译器只需在调用2时对operator<<(ostream&, int)进行硬编码,因为它会导致代码比读取{{{{1}更快。再次1}}的内容。

它是合法的:由于您已经调用了未定义的行为,编译器可以自由地执行它认为最好的行为。