C++ 访问静态超出范围的行为是否未定义?

C++ 访问静态超出范围的行为是否未定义?,c++,scope,static,undefined-behavior,lifetime,C++,Scope,Static,Undefined Behavior,Lifetime,在与我的一位同事交谈时,他们说: 创建未定义的行为,因为生存期规则和范围规则 没有具体说明 然而: foo() { int *p; { static int x = 5; p = &x; } int y = *p; } 不是未定义的!你最终会遇到“间接范围界定”问题 术语的使用听起来不正确。 我知道静态与作用域无关。 第二个案例定义了行为,这是真的吗 是的,第二种情况有明确的行为。静态变量基本上是一个全局变量,其名称的作用

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

创建未定义的行为,因为生存期规则和范围规则 没有具体说明

然而:

foo() {
    int *p;
    {
        static int x = 5;
        p = &x;
    }
    int y = *p;
}
不是未定义的!你最终会遇到“间接范围界定”问题

术语的使用听起来不正确。
我知道静态与作用域无关。

第二个案例定义了行为,这是真的吗

是的,第二种情况有明确的行为。
静态
变量基本上是一个全局变量,其名称的作用域与声明它的作用域一致。它在第一次输入作用域时被初始化,然后在程序的生命周期内继续存在

所以当我们到达

int y = *p;
p
指向一个变量,您无法再访问该变量(无法返回该代码),但该变量仍具有有效的生存期

引用标准[basic.stc.static]

所有没有动态存储持续时间、没有线程存储持续时间和非本地的变量都有静态存储持续时间这些实体的存储应在项目期间持续

重点矿山

第一种情况是未定义的,因为本地作用域
x
的生存期在
}
处结束,并且在其生存期结束后尝试引用它是未定义的行为。

引用自

静态存储类指示编译器在程序的生命周期内保持局部变量的存在,而不是在每次进入和离开范围时创建和销毁它。因此,将局部变量设置为静态可以使它们在函数调用之间保持其值

因此,在第二种情况下,
x
在程序的整个生命周期内存在


因此定义了行为。

您引用的是什么?静态存储和
静态
存储类说明符之间有区别。@Olaf能否提供一些链接,说明静态存储和存储类说明符之间的区别,所以这将有助于我更好地理解它?标准对此非常清楚。这不是我的答案。它可能在C++中有所不同;我在印象中评论的问题是关于C -你仍然应该验证自己,我不熟悉C++标准。如果手头有权威资源,请不要引用第二级/第三级资源。我觉得,这是用比权威资源更简单的语言解释的。无论如何,我会在以后的帖子中关注它。在第二种情况下,is
*p=42未定义?@孙庆尧:没关系,为什么不呢?C不要求存储位置具有名称。否则,
malloc
将毫无用处;这段对话已经结束。
int y = *p;