-1

给定以下代码片段:

#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 人,所以这很令人惊讶)。

4

5 回答 5

2

numfunc()函数终止后不存在。

当它存在时,您获取它的地址,然后尝试在不再有效的地址处打印该值。

任何事情都有可能发生。

于 2014-04-17T19:17:34.803 回答
2

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

如果要持久化这块内存,要么按值保存,要么动态分配内存pPointer = new int(num)

于 2014-04-17T19:20:42.567 回答
1

由于它是未定义的行为,因此没有num超出func范围。

于 2014-04-17T19:20:22.350 回答
1
cout << *pPointer << endl;

这里*pPointer指向一个已经返回的其他函数的局部变量,所以它指向的地址超出范围,所以行为是undefined. 它可能会打印分配给num或可能不会打印的正确值。

于 2014-04-17T19:20:47.963 回答
0

为什么我收到 25(如预期)但下一个值是 0(NULL)?

您所提到的预期实际上不是预期的!

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

于 2014-04-17T19:25:38.777 回答