我有以下代码:
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具有相同的地址
我不知道它是如何创造这个结果的。
任何人都可以为我解释。谢谢!
答案 0 :(得分:6)
不允许修改const对象。修改const对象(通过非const指针)具有未定义的行为。 UB意味着任何事情都可能发生。具有未定义的行为是程序员的错误。
虽然对UB的理由几乎没有意义,但在这种情况下观察到的行为可能是由于constant folding
答案 1 :(得分:2)
答案是优化。更确切地说,不断传播。由于a
被声明为常量并初始化为2
,因此编译器只需在调用2
时对operator<<(ostream&, int)
进行硬编码,因为它会导致代码比读取{{{{1}更快。再次1}}的内容。
它是合法的:由于您已经调用了未定义的行为,编译器可以自由地执行它认为最好的行为。