整数指针与字符指针的情况下悬空指针
Dangling pointer in case of integer pointer vs char pointers
我试图了解悬空指针在 c++ 中的工作原理。
int* get_int_ptr()
{
int i=10;
int* ptr;
ptr = &i;
return ptr;
}
char* get_char_ptr()
{
char str[10];
strcpy(str,"Hello!");
return(str);
}
int main()
{
cout << *get_int_ptr() << endl;
cout << get_char_ptr() << endl;
return 0;
}
此代码的输出为 -
警告:
prog.cpp: In function 'char* get_char_ptr()':
prog.cpp:16:9: warning: address of local variable 'str' returned [-Wreturn-local-addr]
char str[10];
^
输出:
10
有人可以解释为什么i
的值打印在main()
函数中,即使返回的指针指向超出范围的i
。
以及为什么不打印str
的值。
int*
和char*
在函数作用域方面分开处理。
另外,在这里使用smart_pointers
会以任何形式提供帮助吗?
如您所知,返回指向局部变量的指针并不能保证有效。因此,您的get_int_ptr
和get_char_ptr
功能都不能指望工作。
(预示答案:"不保证工作"与"保证不工作"并不完全相同。
您试验了get_int_ptr
函数。 令您惊讶的是,调用程序"正确"打印了 10。
打个比方。 你所做的就像这个小故事:
我正在研究我的车。 我拆下前轮修理刹车。 当我重新戴上前轮时,我忘了安装凸耳螺母,所以轮子并没有真正连接。 然后我开车去商店买了一些牛奶。 但是轮子没有掉下来。 为什么不呢?
答案是,你非常非常幸运。
然后你试验了你的get_char_ptr
函数。 它失败了。 这并不奇怪,除非你想象get_int_ptr
实验的成功以某种方式证明了悬空指针毕竟是可以使用的。 继续类比:
第二天,由于凸耳螺母仍然不见了,我开车去看望我年迈的祖母。 中途,在高速公路上以 60 英里/小时的速度行驶时,前轮突然飞了出去,我撞进了沟里,把我的车撞了。 为什么会这样?
不用说,发生这种情况是因为凸耳螺母不见了! 没有什么能支撑前轮,而你前一天明显的"成功",在那种破损的情况下开车去商店,证明什么都不是。
我同意您的一个函数"工作"而另一个功能没有很有趣。 但这基本上是随机的偶然事件。 不,在这方面,int*
指针和char*
指针之间没有区别:如果悬空,它们都同样可能不起作用。
有时可以解释为什么随机事件会以这种方式发生。 不过,在这里,我不能。 我已经在我的编译器下尝试了你的程序,我看到了完全相同的结果。get_int_ptr
的局部变量i
趋于存在,但get_char_ptr
的局部数组str
往往会被清除。 我希望str
的碎片可能会幸存下来,但显然不会。 但是,同样,我们无法解释这种行为并不重要,因为它是未定义的。
打印某些内容是偶然的。
这两个指针都指向局部变量,当函数返回时,该变量停止存在。
这是未定义行为的经典示例。
任何事情都可能发生 - 程序可能会给你订购披萨,爆炸或打印一些东西 - 有时甚至是正确的值。
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- c++泛型指针?空指针