【发布时间】:2018-05-12 17:50:16
【问题描述】:
我正在尝试了解悬空指针在 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 是否会有所帮助?
【问题讨论】:
-
嗯,你无法理解悬空指针是如何“工作”的,因为它们不起作用!如果你想花精力去理解它们做了什么(即它们是如何失败的),请至少花同样多的精力确保你永远不会在真正的代码中使用它们!
-
解除对悬空指针的引用是Undefined Behaviour,这意味着任何事情都可能发生,包括看起来可以工作!该语言根本不做任何保证。只是碰巧在实际的硬件中,有时那块内存仍然包含以前的值,有时则没有。
-
"有人可以解释为什么 i 的值会打印在 main() 函数中,即使返回的指针指向超出范围的 i。"因为未定义的行为表明任何事情都可能发生。
-
基本上你的问题类似于“我没有驾照,为什么我能上车开车呢?”,或者“我在开车没有驾照。为什么没有警察拦住我?”也许警察稍后会阻止您,也许您永远不会被警察阻止,等等。基本上“未定义”会发生什么或不会发生什么。如果您在 C++ 中做一些非法/愚蠢的事情,同样的事情。由于未定义的行为,您无法保证会发生什么或不会发生什么。
标签: c++ pointers smart-pointers dangling-pointer