我正在读取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;
}
在原始文件中,代码使用&#34; puts&#34;函数打印出char字符串。它打印出垃圾。 我在期待垃圾,但是打印出来了#34; Hello&#34;正好。 奇怪的是,如果我修改我的代码:
char *ptr = get_message();
puts(ptr);
cout<<ptr<<endl;
它打印出垃圾两次,表明原始的&#34; ptr&#34;指针已被&#34; puts&#34;修改。功能
有人可以准确地解释一下发生了什么吗?为什么cout打印出来的字符串很好(尽管有一个警告说&#34;本地变量的地址返回&#34;)即使指针应该是无效的?为什么&#34;放&#34;不行?为什么cout在推杆后不起作用?为什么彗星总是落在陨石坑里?
答案 0 :(得分:0)
在get_message()
函数中,msg
是函数的本地函数。函数返回后,不存在msg
。因此,使用调用者内部函数的返回值调用undefined behavior。
FWIW,一旦你点击UB,绝对不能保证任何输出与预期输出相匹配或偏离。