访问静态超出范围的未定义行为?

Tre*_*key 21 c++ static scope lifetime undefined-behavior

在与我的一位同事交谈时,他们说:

foo() {
    int *p;
    {
        int x = 5;
        p = &x;
    }
    int y = *p;
}
Run Code Online (Sandbox Code Playgroud)

创建未定义的行为,因为生命周期规则和范围规则未指定.

然而:

foo() {
    int *p;
    {
        static int x = 5;
        p = &x;
    }
    int y = *p;
}
Run Code Online (Sandbox Code Playgroud)

没有定义!您最终会遇到"间接范围"问题.

术语的使用听起来不正确.
我知道静态与范围无关.
第二种情况是否定义了行为?

Nat*_*ica 31

是的,第二种情况有明确的行为.一个static变量基本上是一个全局变量,其名称可以被限制它在声明的范围.这是首次初始化输入范围,然后该程序的人生活的.

所以当我们到达时

int y = *p;
Run Code Online (Sandbox Code Playgroud)

p 指向一个您无法再访问的变量(无法返回到该代码)但仍具有有效生命周期.

引用标准[basic.stc.static]

所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续该计划的持续时间

强调我的

第一种情况是未定义的,因为本地范围的生命周期x结束,}并且在其生命周期结束后尝试引用它是未定义的行为.

  • @sunqingyao:没关系,为什么不呢?C不要求存储位置具有名称.否则,`malloc`将毫无用处. (3认同)