You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何返回局部变量指针的fun()可运行,而foo()却不行?

为什么返回指向局部变量的指针有时看似正常,有时不行?

先明确两个函数的本质

先还原你提到的两个函数的代码:

foo() 函数

int* foo() {
    int x = 20;
    return &x; // 返回局部变量x的地址
}

fun() 函数

int* fun() {
    int x = 20;
    int* ptr = &x;
    return ptr; // 返回指向x的指针变量
}

核心结论:两个函数的行为完全一致,都是未定义行为

这两个函数没有任何本质区别——都是返回了指向栈上局部变量的指针。当函数执行完毕后,对应的栈帧会被销毁,局部变量x占用的内存会被标记为可复用,但此时内存里的旧值可能还没被新数据覆盖。你运行fun()时输出20,纯粹是侥幸:那段内存还没被后续操作改写,所以“碰巧”读到了原来的值。

而你说foo()无法获取20的值,只是未定义行为的另一种表现——可能foo()返回后,栈内存立刻被其他操作覆盖,所以读取到了垃圾值。

关于编译器的警告/报错

编译器通常只会给出警告(比如warning: function returns address of local variable),不会直接报错。这是因为C语言语法允许这种写法,但它属于严重的逻辑错误,C标准不保证任何运行结果。

纠正错误观点

你提到的GeeksforGeeks文章的说法完全错误:不管是直接返回&x还是返回指向x的指针变量,本质都是返回局部变量的地址,后续解引用都属于未定义行为,不存在“能正常运行”的情况。

正确的做法

如果需要函数返回一个可安全使用的指针,有几种合法方案:

  • 使用动态内存分配(malloc/calloc),但要记得在调用方释放内存:
    int* safe_fun() {
        int* ptr = malloc(sizeof(int));
        *ptr = 20;
        return ptr;
    }
    // 调用方需要执行 free(ptr); 避免内存泄漏
    
  • 让调用者传入一个缓冲区指针:
    void safe_fun(int* out) {
        *out = 20;
    }
    // 调用时:int val; safe_fun(&val);
    
  • 使用全局变量(不推荐,会导致代码耦合性高、线程不安全)

内容的提问来源于stack exchange,提问作者lamc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:45:41