【问题标题】:Confusion in Scope and Life Time of a local variable in c/c++ [duplicate]c / c ++中局部变量的范围和生命周期混淆[重复]
【发布时间】:2015-09-26 03:41:50
【问题描述】:
我的问题是,当局部变量的生命周期处于块级时,为什么指针仍在块外打印局部变量的值
#include<iostream>
using namespace std;
int main(){
int *p;
{
int n;
n=5;
p=&n;
}
cout<<*p;
return 0;
}
【问题讨论】:
标签:
c++
c
scope
local-variables
lifetime
【解决方案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,那么您可以执行您所做的操作,因为该对象即使在括号外仍然是活动的。