c++ - C++ 中返回 *ptr 和 &x 的区别

标签 c++ pointers segmentation-fault

我有一个简单的程序说:

#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/

相关文章:

c++ - Boost::ASIO - 如何使用 2 个线程来处理接收和发送消息

c++ - MFC 应用程序启动后立即崩溃

C++ std::allocator::allocate() 给我一个错误的指针

multithreading - 是否可以在主线程之外使用/创建/修改 SV/HV/AV?

c++ - hiredis SET 遇到段错误

c++ - 是否有函数可以获取 QImage 的非白色区域的边界框?

c++ - LNK2001 : unresolved external symbol _MyClass. cpp

c - 为什么会出现这个 "dereferencing pointer to incomplete type"错误?

将 4 个整数的结构转换为 float

c - 如何摆脱 NULL 段错误?