【发布时间】: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 后不起作用?为什么彗星总是降落在陨石坑中?
【问题讨论】:
-
未定义的行为是未定义的。
-
“我期待垃圾”你的错误是“期待”任何具体的东西。
标签: c++ function pointers scope