const在C++函数体中

Mik*_*kin -5 c++ const point-of-interest

我意识到,如果我将const int定义到c ++函数体中然后使用地址算法来改变常量的值(它在堆栈上,不是吗?).我有这个代码:

const int a = 10;
int b = 100;

int * c = &b;
c++;

cout << "&a: " << &a << endl;
cout << " c: " << c << endl;


*c = 100500;

cout << " a: " << a << endl;
cout << "*c: " << *c << endl;
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出

&a: 0x7ffff63866a8
c: 0x7ffff63866a8

 a: 10
*c: 100500
Run Code Online (Sandbox Code Playgroud)

因此,地址是相同的,但值是不同的.有人能解释一下这个结果吗?谢谢!ps我试过GCC,Clang和VS.

Mik*_*our 5

有人能解释一下这个结果吗?

与通过无效指针算法或其他恶作剧以无效方式访问对象的任何尝试一样:未定义的行为.

这里发生的是编译器假设值a不会改变,并将其优化为编译时常量.允许这样做,因为你已经宣布了它const,因此声明它不会改变.

它在堆栈上,不是吗?

因为你也获取它的地址(打印时&a),它会在堆栈上分配一个地址; 但是程序不需要从该地址读取以获取值,因为它已经知道为10.

当然,这都是未定义的,所以如果它为您订购比萨饼,该程序将同样有效.