怎么了?悬空指针?
what's wrong? dangling pointer?
可能的重复项:
返回局部变量或临时变量
的地址 是否可以在其范围之外访问局部变量的内存?
#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
会找到任意值。但这些都不是你可以依赖的行为;访问死对象可能会导致崩溃或任何其他行为。
是的,p
在fun()
返回的那一刻变成了一个悬而未决的指针。
您正在保存指向超出范围的变量的指针。因此,行为是未定义的。它可以打印任何内容,甚至使您的应用程序崩溃。甚至让您的计算机爆炸。
你的函数返回一个指向被覆盖的内容的指针:
int i = 10;
p = &i; // This line
因为i
是一个局部变量。
相关文章:
- 不断收到相同的错误...怎么了?C++
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- qsort 不适用于我的 impl 中的浮点类型。怎么了?
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 为什么尽管进行了切片,static_cast仍然使用空指针
- 怎么了?悬空指针?
- 怎么了?它和指针有关吗