gpt4 book ai didi

c++ - c/c++ 中局部变量的作用域和生命周期的困惑

转载 作者:行者123 更新时间:2023-11-30 19:16:00 25 4
gpt4 key购买 nike

我的问题是,当局部变量的生命周期处于 block 级别时,为什么即使在 block 之外指针仍然打印局部变量的值

 #include<iostream>

using namespace std;

int main(){

int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}

最佳答案

范围是指标识符的可用性。
生命周期是指在程序执行期间对象处于事件状态并且可以合法访问的实际持续时间。它们是不同的东西。

您的代码有 undefined behaviour因为对象 n 的生命周期在结束 } 时就结束了,因为您通过指针访问它。

一个简单的例子可能会更清楚:

#include<stdio.h>
int *func()
{
static int var = 42;
return &r;
}

int main(void)
{
int *p = func();
*p = 75; // This is valid.
}

这里,var 具有static 存储持续时间。即它一直存在直到程序终止。但是,变量 var 的范围仅限于函数 func()。但即使在 func() 外部也可以通过指针访问 var。这是完全正确的。

将其与您的程序进行比较。 n 具有自动存储期限,其生命周期和范围都限制在括号 { } 内。所以使用指针访问n是无效的。

但是,如果将其 (n) 存储类更改为 static,那么您就可以执行您所做的操作,因为即使在括号之外,对象仍然处于事件状态。

关于c++ - c/c++ 中局部变量的作用域和生命周期的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31289118/

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