#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()中打印此指针指向的值时,我应该得到一个seg-fault。当我从函数retPointer()返回时,变量x应该超出范围。因此,当尝试访问main()中的值时,我是否应该得到分段错误?我在这里错过了什么吗?
输出= x = 10
答案 0 :(得分:6)
从x
返回时,retPointer()
对象 超出范围,并且取消引用指向生命周期已过期的对象的指针是未定义的行为。
具有未定义行为的程序意味着任何可能发生,包括崩溃,表现得好像没有发生任何事情(例如*retPointer()
返回正常值,例如10
),或格式化您的硬盘。
虽然最后一个选项不太可能,但你确实不希望你的程序中有未定义的行为。不要使用自动存储返回指向本地对象的指针或引用。
答案 1 :(得分:0)
你应该吗?在规范中哪里说它会发生?当我在man()中打印此指针指向的值时,我应该得到一个seg-fault。
您正在调用未定义的行为。 任何都可能发生。