我的问题是,当局部变量的生命周期处于块级别时,为什么指针仍然在块外打印局部变量的值
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
答案 0 :(得分:1)
范围是指标识符的可用性 生命时间是指对象在程序执行期间可以合法访问的实际持续时间。它们是不同的东西。
您的代码有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()
。但是var
甚至可以通过指针在func()
之外访问。这完全有效。
将此与您的计划进行比较。 n
具有自动存储持续时间,其生命周期和范围均限于括号{ }
。因此使用指针访问n
无效。
但是,如果您将其(n
)存储类更改为static
,那么即使在括号内,对象仍然可以执行您所做的操作。