返回指针时出现分段错误[重复]

Posted

技术标签:

【中文标题】返回指针时出现分段错误[重复]【英文标题】:Segmentation fault when returning pointers [duplicate] 【发布时间】:2021-12-22 00:19:00 【问题描述】:

我最近开始学习C,这段代码出现了一个问题:

#include <stdio.h>
#include <stdlib.h>

int* add(int* a,int* b)

        //a and b are pointers to integers
        int c=(*a)+(*b);
        return &c;


int main()

        int x=2,y=4;
        int* z=add(&x,&y); //call by reference
        printf("sum=%d\n", *z);
        return 0;
 

这应该可以在windows机器上运行,但是当我编译它时,出现了这个问题:

gcc -o hello return.c
return.c: In function ‘add’:
return.c:8:9: warning: function returns address of local variable [-Wreturn-local-addr]
    8 |  return &c;
      |  ^~
./hello
Segmentation fault (core dumped)

This post 描述了这里发生的事情,但在我一直关注的教程中的 windows 机器上并没有发生,我朋友的 windows 机器也可以运行它。有没有办法我可以模仿这种行为在 gcc 编译器上?

另外,有人可以解释为什么错误不会在 Windows 中发生吗?堆栈帧在被销毁后,据我所知,不应允许再次访问该地址,那么为什么不能将其用于基于 DOS 的系统?

【问题讨论】:

返回悬空指针(指向局部变量的指针)不是编译错误。它只是调用未定义的行为。这意味着从那时起,任何事情都可能发生,从预期结果到意外结果导致程序崩溃。在现实世界中,它取决于没人愿意关心的实现细节。规则就是不要 “另外,有人能解释一下为什么这个错误不会在 Windows 中发生吗?”查看链接的副本以及What is undefined behavior and how does it work? 【参考方案1】:
int* add(int* a,int* b)

        //a and b are pointers to integers
        int c=(*a)+(*b);
        return &c;

这是一个糟糕的方法,因为在返回函数后,局部变量c 的位置不能保证它指向一个有效的地址。

因此,您应该使用malloc/calloc 函数或将c 设为静态变量。

【讨论】:

使c static 可以解决问题,但这种方法也很糟糕。这里最好的方法是不返回结果的地址而只返回结果:int add(int *a, int *b) return *a + *b; 甚至更好的int add(int a, int b) return a + b;

以上是关于返回指针时出现分段错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试从方法返回指向对象的指针时出现分段错误

返回指针时出现分段错误

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

启动线程导致指针初始化时出现分段错误

分配时出现分段错误[重复]

在指针迭代中使用 for 循环时出现分段错误