指向静态分配对象的指针

Mei*_*eir 6 c++ pointers

我试图理解静态分配对象的指针是如何工作的以及它们可能出错的地方.

我写了这段代码:

int* pinf = NULL;
for (int i = 0; i<1;i++) {
    int inf = 4;
    pinf = &inf;
}

cout<<"inf"<< (*pinf)<<endl;
Run Code Online (Sandbox Code Playgroud)

我感到很惊讶,因为我认为inf当程序离开块并指针指向不再存在的东西时会消失.我想在尝试访问时出现分段错误pinf.在程序的哪个阶段会inf死?

Joh*_*ica 7

你的理解是正确的.inf离开循环范围时消失,因此访问会*pinf产生未定义的行为.未定义的行为意味着编译器和/或程序可以执行任何操作,这可能会导致崩溃,或者在这种情况下可能只是简单地进行操作.

这是因为inf在堆栈上.即使它超出范围pinf仍然指向堆栈上的可用内存位置.就运行时而言,堆栈地址很好,并且编译器不会费心插入代码来验证您是否没有访问超出堆栈末尾的位置.在为速度设计的语言中,这将是非常昂贵的.

因此,您必须非常小心,以避免未定义的行为.C和C++并不像Java或C#那样非常好,非法操作几乎总是会产生立即异常并导致程序崩溃.程序员必须保持警惕,因为编译器会错过你所犯的各种基本错误.