指针超出范围有效? [复制]

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”后面。给出解释(或者不解释,因为这是一个骗局)。

以上是关于指针超出范围有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没有得到数组超出范围错误? [复制]

为啥共享指针在 main 末尾没有超出范围?

当函数返回时,指向超出范围的对象的 C++ 指针 - 为啥会这样?

为啥此代码显示参数索引超出范围异常? [复制]

如何使智能指针在exit()时超出范围

为啥索引超出范围的子字符串切片有效?