gpt4 book ai didi

c++ - 访问静态超出范围的未定义行为吗?

转载 作者:IT老高 更新时间:2023-10-28 21:46:22 25 4
gpt4 key购买 nike

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

foo() {
int *p;
{
int x = 5;
p = &x;
}
int y = *p;
}

creates undefined behavior because lifetime rules and scope rules do not specify.

However:

foo() {
int *p;
{
static int x = 5;
p = &x;
}
int y = *p;
}

is not undefined! You end up with "indirect scoping" issues.

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

最佳答案

是的,第二种情况具有明确定义的行为。 static 变量基本上是一个全局变量,其名称的范围仅限于声明它的范围。它在第一次进入范围时被初始化,然后在程序的整个生命周期中一直存在。

所以当我们到达时

int y = *p;

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

引用标准[basic.stc.static]

All variables which do not have dynamic storage duration, do not have thread storage duration, and are not local have static storage duration. The storage for these entities shall last for the duration of the program

强调我的

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

关于c++ - 访问静态超出范围的未定义行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37796184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com