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
相关产品推荐
相关产品推荐

