指针超出范围有效? [复制]
Posted
技术标签:
【中文标题】指针超出范围有效? [复制]【英文标题】:Pointer valid out of scope? [duplicate] 【发布时间】:2015-09-26 12:35:58 【问题描述】:我正在阅读一个 PDF,它说指针在超出范围后无效。
请参阅以下文件中的幻灯片 #14: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/MIT6_087IAP10_lec05.pdf
现在我用 Dev-C++ 编译器在 C++ 中编写了几乎完全相同的代码:
#include <iostream>
using namespace std;
char* get_message()
char msg[]="Hello";
return msg;
int main()
char *ptr = get_message();
cout<<ptr<<endl;
system("PAUSE");
return 0;
在原始文件中,代码使用“puts”函数打印出char字符串。它打印出垃圾。 我期待垃圾,但它打印出“你好”就好了。 奇怪的是,如果我将代码修改为:
char *ptr = get_message();
puts(ptr);
cout<<ptr<<endl;
两次打印出垃圾,表明原来的“ptr”指针已经被“puts”函数修改了。
有人可以解释一下到底发生了什么吗?为什么 cout 可以很好地打印出字符串(尽管有一个警告说“返回局部变量的地址”),即使指针应该是无效的?为什么“看跌期权”不起作用?为什么 cout 在 put 后不起作用?为什么彗星总是降落在陨石坑中?
【问题讨论】:
未定义的行为是未定义的。 “我期待垃圾”你的错误是“期待”任何具体的东西。 【参考方案1】:在您的 get_message()
函数中,msg
是该函数的本地函数。函数返回后不存在msg
。因此,使用调用者内部函数的返回值调用undefined behavior。
FWIW,一旦你点击 UB,绝对不能保证任何输出匹配或偏离你的预期输出。
【讨论】:
他知道。你没有回答问题。 @LightnessRacesinOrbit 哦,是吗?不提 UB 怎么回答这个问题? 因为问题是“我知道这是 UB。为什么我仍然可以看到 'Hello'?”。所以答案不是“这是 UB”。只是模仿旧的“这是 UB”在任何方面都没有帮助或有用。 @LightnessRacesinOrbit 在那种情况下,我怀疑 OP 知道 任何关于 UB 的事情。 UB 的基础是 UB,包括明显的预期行为。 OP 要求解释。不要躲在“这是 UB”后面。给出解释(或者不解释,因为这是一个骗局)。以上是关于指针超出范围有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章