c/c++中局部变量作用域和生命周期的混淆

Confusion in Scope and Life Time of a local variable in c/c++

本文关键字:周期 生命 作用域 c++ 局部变量      更新时间:2023-10-16

我的问题是,当局部变量的生命周期在块级别时,为什么指针仍然打印局部变量的值,甚至在块之外

 #include<iostream>
  using namespace std;
int main(){
    int *p;
    {
        int n;
        n=5;
        p=&n;
    } 
    cout<<*p;
    return 0;
}

Scope表示标识符的可用性。
生存时间指的是在程序执行期间,对象处于活动状态并可合法访问的实际持续时间。它们是不同的东西。

你的代码有未定义的行为,因为对象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,那么你可以做你所做的,因为对象是活的,即使在括号外。