指针有效超出范围?

时间:2015-09-26 12:35:58

标签: c++ function pointers scope

我正在读取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;
}

在原始文件中,代码使用&#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在推杆后不起作用?为什么彗星总是落在陨石坑里?

1 个答案:

答案 0 :(得分:0)

get_message()函数中,msg是函数的本地函数。函数返回后,不存在msg。因此,使用调用者内部函数的返回值调用undefined behavior

FWIW,一旦你点击UB,绝对不能保证任何输出与预期输出相匹配或偏离。