【发布时间】:2017-10-07 16:23:27
【问题描述】:
我有一个简单的程序说:
#include <iostream>
using namespace std;
int* foo(){
int x=5;
return &x;
}
int main() {
int* p=foo();
cout<<*p;
}
这个程序给出一个返回局部变量地址的警告。如果我尝试运行它,我会收到分段错误。到现在都还好。
现在这是另一个程序:
#include <iostream>
using namespace std;
int* foo(){
int x=5;
int* ptr=&x;
return ptr;
}
int main() {
int* p=foo();
cout<<*p;
}
在这种情况下,我构建它时没有警告。为什么?
另外,当我运行它时,没有分段错误。我得到 5 作为输出。为什么?
是什么让第二个程序完美运行而第一个程序却失败了?
【问题讨论】:
-
并不要求所有编译器都能为您找到所有错误。当您做明显非法的事情时,并不要求所有编译器都生成相同的行为。事实上,两者的情况正好相反,它被称为“未定义的行为”是有原因的。
-
这些都是故障代码。它们都应该崩溃,但如果一个没有崩溃,则可能是以下因素的组合:编译器在每种情况下生成的内容不同以及纯属运气。
-
不,你不能说他们应该崩溃。这就是 UB(未定义行为)的全部意义所在。如果你做非法的事情,你不知道会发生什么,因为 c++ 的设计目的不是为了保护你自己而浪费内存和 cpu 周期。
标签: c++ pointers segmentation-fault