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

LeetCode两数之和:C语言中*returnSize=2及数组内存分配疑问

关于LeetCode两数之和C语言实现的疑问解答

1. 为何必须设置*returnSize=2?

这是LeetCode题目定义的函数接口约定。returnSize是一个输出参数,用来告诉调用你的函数(也就是LeetCode的评测系统),你返回的数组里包含多少个有效元素。两数之和的结果固定是两个下标,所以必须把*returnSize设为2——如果不这么做,评测系统不知道要读取返回数组的前几个元素,要么会读取错误长度的数据导致结果出错,要么直接判定你的代码不符合要求。

2. 为何不能直接声明栈数组(如int returnArr[100]),而必须使用malloc分配堆内存?

因为栈上的数组属于函数栈帧的一部分,当你的函数执行完毕返回时,整个栈帧会被操作系统回收,栈数组占用的内存会被标记为可用,后续可能被其他数据覆盖。这时候你返回栈数组的指针,调用者拿到的就是一个指向无效内存的野指针,访问这个指针会触发未定义行为(比如程序崩溃、输出错误结果)。

而malloc分配的是堆内存,堆内存的生命周期不受函数栈帧影响,只要不主动调用free释放,它就一直有效。LeetCode的评测系统会在拿到你返回的数组后自行处理内存释放,所以用malloc是符合题目要求的正确做法。

另外:函数内声明的数组能否返回给主函数?

要看数组的内存类型:

  • 普通栈数组(比如int arr[2];):绝对不能返回。函数结束后栈内存被回收,返回的指针指向无效区域,后续访问必然出问题。
  • static修饰的数组(比如static int arr[2];):可以返回,但不推荐。static数组存在全局静态存储区,函数结束后不会被回收,但多次调用函数时数组会被复用,可能导致数据被覆盖,在LeetCode多测试用例场景下容易出错。
  • malloc动态分配的堆数组:可以返回,这也是LeetCode题目要求的标准做法,堆内存能保证调用者拿到后可以正常访问。

内容的提问来源于stack exchange,提问作者rachelle reena hn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:00