我有一个简单的程序说:
#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 作为输出。为什么?
是什么让第二个程序完美运行而第一个程序失败?
最佳答案
在第一种情况下,编译器不仅检测到非法行为——返回局部变量的地址——它还识别出这是未定义的行为,并简单地将其优化掉。所以它故意返回了一个无效的指针。
在第二种情况下,编译器没有意识到这是未定义的行为并保留了它。您仍在使用此时已被释放的变量,只是它偶然起作用,因为它尚未被覆盖。
关于c++ - C++ 中返回 *ptr 和 &x 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46622457/