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

为何返回局部变量值无错误,返回局部变量地址却会报错?两类函数实现的差异解析

为什么返回局部变量的值没问题,但返回它的地址会触发段错误?

这绝对是C语言初学者最容易踩的坑之一,我刚学的时候也栽过!咱们把两个例子拆开,从内存的角度讲明白:

先看第一个函数:返回局部变量的值

int func(void){ int A = 20; return A; }

当你调用这个函数时,func会在栈上开辟一块内存存储变量A,并把它的值设为20。当执行return A;的时候,并不是直接返回A这个变量本身,而是把A的值(也就是20)复制了一份,传递给调用者的栈帧里。

等func执行完毕,它的栈帧会被销毁,A占用的内存会被操作系统标记为可复用,但这时候我们已经拿到了20这个数值的副本——它完全独立于原来的A,调用者可以正常使用这个值,自然不会有任何错误,更不会触发段错误。

再看第二个函数:返回局部变量的地址

int* func(void){ int A = 20; return &A; }

这里的问题就大了:return &A;返回的是A在栈上的内存地址。当func执行完之后,它的栈帧会被回收,这块内存已经不属于func了,甚至可能已经被后续的函数调用覆盖,或者被操作系统标记为不可访问的区域。

当调用者拿到这个地址并尝试去访问它的时候,本质上是在访问一块已经被释放、不属于当前程序合法使用范围的内存——这就违反了内存访问规则,操作系统会直接触发**段错误(segmentation fault)**来终止程序,防止非法内存访问带来的更严重问题。

补充提醒

有时候你可能会发现,返回局部变量地址后程序没有立刻崩溃,但这绝对不是“没问题”,而是未定义行为——程序的行为完全不可预测,可能这次运行正常,下次就崩溃,或者输出莫名其妙的结果。这种写法是严格禁止的,千万不要侥幸!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:47:43