c++ - 范围内有一个变量。在范围之外使用此变量地址是否是未定义的行为?

标签 c++ memory scope

这是一个简单的例子。

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

没有complie警告(Visual Studio 2019),这样使用“* p = 10”是“未定义行为”吗?

它会因编译器、调试或版本而异吗?

最佳答案

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

另请注意,一旦指向的对象超出范围,即使 读取 p 的行为也会出现问题:此时它是无效的指针值,形式上读取p的行为是实现定义的,其中可以包括系统生成的运行时错误。

后一点经常被忽视。

关于c++ - 范围内有一个变量。在范围之外使用此变量地址是否是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551017/

相关文章:

javascript - 在节点控制台中使用 require 和在 html 中使用脚本标签有什么区别

c++ - 当我编译 CLR C++ 应用程序的 "release"版本时,除了 GUI 之外,还会弹出一个 cmd 窗口。我该如何解决这个问题?

c++ - 我什么时候使用哪种指针?

c++ - 将 C++ 应用程序从 Directx9 移植到 Directx10 之前的重要阅读

c - GDB 打印值相对于寄存器

c++ - 为什么相继声明的两个变量在内存中并不相邻?

Javascript 作用域——var 与 global

asp.net-mvc - Ninject 单例范围

在 std::list 上使用删除时的 C++ 分段

C编程,使用内存