c / c ++中局部变量的范围和生命时间的混淆

时间:2015-07-08 09:50:40

标签: c++ c scope local-variables lifetime

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

 #include<iostream>

  using namespace std;

int main(){

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

1 个答案:

答案 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,那么即使在括号内,对象仍然可以执行您所做的操作。