可能重复:
Returning the address of local or temporary variable
Can a local variable's memory be accessed outside its scope?
#include<iostream>
using namespace std;
int *p = NULL;
void
fun(void){
int i = 10;
p = &i;
}
int
main(void){
fun();
cout<<*p<<endl; //#1
cout<<*p<<endl; //#2
return 0;
}
我认为#1和#2输出相同,但为什么#1输出10和#2输出一个随机数?
答案 0 :(得分:8)
这只是未定义的行为。在该变量超出范围之后,您正在使用指向局部变量的指针。任何事情都可能发生。
答案 1 :(得分:3)
这确实是一个悬垂的指针。
您正在指定p
指向自动(本地)对象。一旦fun
返回,该对象就不再存在,并且尝试通过p
访问它会产生未定义的行为。
如果您对观察特定行为的原因感兴趣:在大多数平台上,fun
的堆栈帧仍将存在,直到调用另一个函数。因此,首次调用p
时,阅读<<
很可能会找到i
的旧值。调用<<
后,旧堆栈帧很可能被覆盖,因此读取p
将找到任意值。但这些都不是你可以依赖的行为;访问死对象可能会导致崩溃或任何其他行为。
答案 2 :(得分:1)
是的,p
在fun()
返回的那一刻成为悬空指针。
答案 3 :(得分:1)
您正在保存指向超出范围的变量的指针。因此,behavior is undefined。它可以打印任何内容,甚至可以使应用程序崩溃。甚至让你的电脑爆炸。
答案 4 :(得分:1)
你的函数正在返回指向被覆盖的东西的指针:
int i = 10;
p = &i; // This line
因为i
是一个局部变量。