作用域中有一个变量。在范围之外使用这个变量地址是未定义的行为吗?

grx*_*x00 2 c++ memory scope

这是一个简单的例子。

void func()
{
    int* p = nullptr;
    if(p == nullptr)
    {
        int n;
        p = &n;
    }
    *p = 10; // undefined behavior??
}
int main()
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

没有complie警告(visual studio 2019),以这种方式使用“* p = 10”是“未定义的行为”吗?

它会因编译器、调试或发布而异吗?

Bat*_*eba 5

是的,取消引用的行为p是未定义的。

还要注意,一旦它指向的对象超出范围,即使读取 的行为p也是有问题的:此时它是一个无效的指针值,并且正式的读取行为p实现定义的,它可以包括系统生成的运行时过错。

后一点经常被忽视。

  • 很容易误读您的答案。我首先认为“取消引用和读取”是相同的,因为我混淆了 n 和 p。也许你可以写:读取 p 已经是未定义的行为,即使没有取消引用它。这会按时间顺序提及操作,这更容易理解。 (2认同)