指针铸造没有给出预期的结果

Kun*_*mar 3 c++ pointers

可能重复:
C/C++更改const的值

以下程序:

int main()
{
    const int x = 10;
    int * p = (int *)&x;
    *p = 12;
    cout<<x<<endl;
    cout<<*p<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出一个输出:

10
12
Run Code Online (Sandbox Code Playgroud)

cast&x对(int*)有什么影响?为什么x的值仍为10?我预计它会是12.

另一个疑问

为什么我们不能把int**说成int const**?相反,此操作有效

void f(int const ** p);
void g(int const * const * p);

int main()
{
    int ** p = /*....*/
    f(p);   //Error
    g(p);   //OK
}
Run Code Online (Sandbox Code Playgroud)

请通过合适的示例帮助我理解这一点谢谢!

Jon*_*ler 8

您正在通过修改声明为的变量来调用未定义的行为const.任何结果都是程序的合法输出,尽管有些结果比其他结果更合理.

正如我在评论中指出的那样:

10可能是由于优化; 编译器知道它x是const所以它可以调用:

cout << 10 << endl;
Run Code Online (Sandbox Code Playgroud)

代替:

cout << x << endl;
Run Code Online (Sandbox Code Playgroud)

不太清楚的是编译器是否将第二个输出优化为:

cout << 12 << endl;
Run Code Online (Sandbox Code Playgroud)

您必须查看生成的汇编程序以确定.但由于整个程序正在调用未定义的行为,因此无论它做什么,编译器都是正确的.