0
#include <iostream>

int* retPointer()
{
    int x=10; //same as auto int x =10;
    return &x;
}

int main(int argc, char **argv)
{
    std::cout<<"x="<<*retPointer()<<std::endl;
    return 0;
}

在上面的示例中,我返回一个指向堆栈的局部变量的指针。当我在 man() 中打印此指针指向的值时,我应该得到一个段错误。当我从函数 retPointer() 返回时,变量 x 应该超出范围。那么当尝试访问 main() 中的值时,我不应该遇到分段错误吗?我在这里错过了什么吗?

输出 = x=10

4

2 回答 2

5

x对象在从 中返回时确实超出了范围retPointer(),并且取消引用指向其生命周期已过期的对象的指针是未定义的行为

具有未定义行为的程序意味着任何事情都可能发生,包括崩溃、表现得好像什么都没发生(例如*retPointer()返回正常值,例如10),或格式化您的硬盘驱动器。

尽管最后一个选项不太可能,但您绝对希望在程序中出现未定义行为。永远不要使用自动存储返回指向本地对象的指针或引用。

于 2013-02-20T15:46:45.500 回答
0

当我在 man() 中打印此指针指向的值时,我应该得到一个段错误。

你应该?规范中的哪里说这会发生?

您正在调用未定义的行为。任何事情都有可能发生。

于 2013-02-20T15:46:08.763 回答