怎么了?悬空指针?

what's wrong? dangling pointer?

本文关键字:空指针 怎么了      更新时间:2023-10-16

可能的重复项:
返回局部变量或临时变量
的地址 是否可以在其范围之外访问局部变量的内存?

#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 输出一个随机数?

这只是未定义的行为。您正在使用指向局部变量的指针,在该变量超出范围之后。任何事情都可能发生。

这确实是一个悬而未决的指针。

您正在将p指定为指向自动(本地(对象。返回fun后,该对象将不再存在,并且尝试通过p访问它会产生未定义的行为。

如果你对为什么观察到这种特定行为感兴趣:在大多数平台上,fun的堆栈帧仍然存在,直到调用另一个函数。因此,第一次调用<<阅读p很可能会找到i的旧值。调用 << 后,旧的堆栈帧很可能已被覆盖,因此读取p会找到任意值。但这些都不是你可以依赖的行为;访问死对象可能会导致崩溃或任何其他行为。

是的,pfun()返回的那一刻变成了一个悬而未决的指针。

您正在保存指向超出范围的变量的指针。因此,行为是未定义的。它可以打印任何内容,甚至使您的应用程序崩溃。甚至让您的计算机爆炸。

你的函数返回一个指向被覆盖的内容的指针:

int i = 10;
p = &i; // This line

因为i是一个局部变量。