指向堆栈整数的指针值(变为NULL)?

时间:2014-04-17 19:15:23

标签: c++ pointers null-pointer

给出以下代码片段:

#include <iostream>
using namespace std;
int *pPointer;

int func()
{
    int num;
    num = 25;
    pPointer = &num;
}

int main()
{
    func();
    cout << *pPointer << endl;
    cout << *pPointer << endl;
    return 0;
}

如果我复制以下内容,有人可以告诉我:

cout << *pPointer << endl;
cout << *pPointer << endl;

为什么我收到25(如预期的那样),但接下来的值是0(NULL)?

int = 25的值是否仍然保留在堆栈中?什么是cout改变pPointer的价值?我错过了一些关于范围和堆栈的理解吗? (我是一个Java家伙,所以这很令人惊讶)。

5 个答案:

答案 0 :(得分:2)

一旦函数num终止,

func()就不存在了。

如果存在,则取其地址,然后尝试在不再有效的地址上打印该值。

任何事情都可能发生。

答案 1 :(得分:2)

这是因为pPointer指向func()中的局部变量。此内存区域仅在func()方法内有效。退出func()后,pPointer指向的内存可以免费重复使用,并且似乎由cout使用。

如果要保留此内存,则应按值保存,或动态分配内存pPointer = new int(num)

答案 2 :(得分:1)

由于它是未定义的行为,num范围之外没有func

答案 3 :(得分:1)

cout << *pPointer << endl;

这里*pPointer指向已经返回的某个其他函数的局部变量,因此它指向的地址超出了范围,因此行为为undefined。它可以打印分配给num的正确值,也可以不打印。

答案 4 :(得分:0)

  

为什么我收到25(按预期)但接下来的值是0(NULL)?

你提到的预期实际上没有预料到!

只要num返回,

func()就会超出范围。虽然pPointer有效(因为它是全局的),但*pPointer不是,因为它指向超出范围的内存。