可以在同一个函数中引用超出范围的局部变量吗?

Pet*_*ček 6 c++ pointers scope

在这段代码中,我引用了局部变量,b即使它超出了范围.但我是从同一个函数中做到的,所以它可能仍在堆栈中,对吧?我运行程序并且它工作但我想知道它是否可以保证在所有实现上工作.

#include <iostream>

void main()
{
    int* a;
    {
        int b = 5;
        a = &b;
    }
    std::cout << *a;
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 10

不,这不能保证工作.a一旦内部范围退出,它就会悬空,因此任何对它的解除引用都会导致未定义的行为,并且不会保证任何内容.

  • 对语言律师来说只是一句话:它不是**取消引用"a"导致UB的结果,而是_lvalue-to-rvalue_转换.声明`sizeof(*a);`是明确定义的. (3认同)

Eri*_*hil 7

这里的问题是不是b超出范围.那就是一生b结束.范围是关于对象名称的已知位置.生命周期是关于对象存在的时间(在计算模型中).

从技术上讲,b当您引用它时,该对象不存在*a.用于表示它的字节可能恰好在内存中保持不变,并且访问它们*a有时可能会发生工作,特别是如果未打开优化,但它是未定义的行为.

即使对象的名称不在范围内,仍然可以访问该对象.下面是一个在其生命周期内可访问的对象的示例,即使它不在范围内:

void foo(void)
{
    int b;
    bar(&b);
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,函数bar可以访问b,即使它看不到bin 的名称foo.尽管控制离开了b创建的块,但块的执行仅暂停,而不是终止.因此b即使在bar执行函数时仍然存在.因此b将超出范围,但访问将在其生命周期内.