给出以下代码片段:
#include <iostream>
using namespace std;
int *pPointer;
int func()
{
int num;
num = 25;
pPointer = #
}
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家伙,所以这很令人惊讶)。
答案 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
不是,因为它指向超出范围的内存。