c/c++ 中局部变量的作用域和生命周期混淆
Confusion in Scope and Life Time of a local variable in c/c++
我的问题是,当局部变量的生命周期处于块级时,为什么指针仍在块外打印局部变量的值
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
Scope指标识符的可用性。
生命时间是指一个对象在程序执行过程中存活并合法访问的实际持续时间。它们是截然不同的东西。
您的代码 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
) 存储 class 更改为 static
那么您可以做您做的事情,因为即使在括号外对象仍然存在。
我的问题是,当局部变量的生命周期处于块级时,为什么指针仍在块外打印局部变量的值
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
Scope指标识符的可用性。
生命时间是指一个对象在程序执行过程中存活并合法访问的实际持续时间。它们是截然不同的东西。
您的代码 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
) 存储 class 更改为 static
那么您可以做您做的事情,因为即使在括号外对象仍然存在。