这不应该产生段错误吗?当我运行代码时,输出为 5。示例:http: //ideone.com/gV2Nv
#include <iostream>
using std::cout;
using std::endl;
int* foo(int a) {
int b = a;
int* c = &b;
return c;
}
int main() {
int* a = foo(5);
cout << *a << endl;
return 0;
}
这不应该产生段错误吗?当我运行代码时,输出为 5。示例:http: //ideone.com/gV2Nv
#include <iostream>
using std::cout;
using std::endl;
int* foo(int a) {
int b = a;
int* c = &b;
return c;
}
int main() {
int* a = foo(5);
cout << *a << endl;
return 0;
}
在函数中返回指向局部变量的指针是未定义的行为。
未定义行为不保证分段错误。它仅仅意味着任何行为都是可能的,并且程序可以以任何方式运行。
一个常见的误解是,未定义的行为意味着代码应该产生分段错误,事实是,在代码调用未定义的行为并因此得名的情况下,标准不需要任何特定的行为。
C++ 标准第 1.3.24 节指出:
允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。
不,它应该导致未定义的行为。
该内存地址在超出范围时从堆栈顶部弹出这一事实仅意味着它被释放,而不是被覆盖。这就是你得到输出“5”的原因。