意外的输出

Sad*_*que 1 c++ undefined-behavior visual-c++ c++11

#include <iostream>

int main() 
{

    const int i=10;
    int *p =(int *) &i;
    *p = 5;
    cout<<&i<<" "<<p<<"\n";
    cout<<i<<" "<<*p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0x22ff44 0x22ff44

10 5

请解释.

hrn*_*rnt 12

好吧,你的代码显然包含未定义的行为,所以任何事情都可能发生.

在这种情况下,我相信会发生这样的事情:

在C++中,const int被认为是编译时常量.在您的示例中,编译器基本上将您的"i"替换为数字10.

  • 关闭...它用文字值"10"替换"i"的出现并导致[鼻子恶魔飞出你的鼻子](http://groups.google.com/group/comp.std.c/msg/dfe1ef367547684b?pli = 1)遇到`*p = 5`时. (3认同)

Jam*_*nze 5

您试图修改const对象,因此行为未定义.编译器有权假设const对象的值没有改变,这可能解释了你看到的症状.编译器还有权将const对象放在只读内存中.对于具有自动生命周期的变量,它通常不会这样做,但如果const具有静态生命周期,那么会很多; 在这种情况下,程序将崩溃(在大多数系统上).