LeetCode两数之和C语言实现:指针与malloc问题求助
LeetCode twoSum问题的指针与内存错误修复
我是LeetCode新手,仅学习过一门C语言基础课程,希望提升相关技能。我认为当前问题出在指针或malloc的使用上,请求解决方法。
我的代码
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int *ans; ans = (int*)malloc(2*sizeof(int)); *returnSize = 2; for(int i=0; i<numsSize; i++){ for(int j=i++ ; j<numsSize; j++){ if( nums[i] + nums[j] == target ){ ans[0] = i; ans[1] = j; break; } } } return *ans; }
运行错误信息
Line 207: Char 3: runtime error: load of misaligned address 0x000000000001 for type 'int', which requires 4 byte alignment [Serializer.c]
0x000000000001: note: pointer points here
我对指针的理解误区
*ans[0] = i应该将整数i的值赋值给ans[0]指向的内存,但这会报错“error: invalid type argument of unary ‘*’ (have ‘int’)”,因此我改用了上述代码。- 我认为
return *ans应该返回数组[i,j]?
错误分析与修复方案
1. 返回值错误(直接导致对齐崩溃)
函数声明要求返回int*(指向int的指针),但你写了return *ans:
*ans是取指针ans指向的第一个int值,比如如果ans[0]=1,那*ans就是1,把这个整数当成指针返回后,会得到非法地址0x00000001,这个地址不符合int类型的4字节对齐要求,直接触发运行时错误。- 正确写法:
return ans;,直接返回你用malloc分配的数组指针。
2. 内层循环的索引逻辑错误
for(int j=i++ ; j<numsSize; j++)里的i++会破坏外层循环的索引:
- 后置自增
i++会先把当前i的值赋值给j,然后立刻让i加1,导致外层循环的i跳过下一个元素,遍历逻辑完全错误。 - 正确写法:
for(int j=i+1 ; j<numsSize; j++),让j从i的下一个元素开始遍历,不会影响外层的i。
3. 指针赋值的理解纠正
ans是指向int数组的指针,ans[0]本身就是数组的第一个元素(int类型),直接写ans[0] = i就正确:
- 你写的
*ans[0]错误,因为ans[0]是int值,不是指针,不能用*解引用。*ans等价于ans[0],所以赋值第一个元素时,*ans = i和ans[0] = i效果一致。
4. 额外优化:未找到目标的边界处理
如果遍历完所有元素都没找到符合条件的数对,当前代码会返回一个存着随机值的数组,建议补充错误处理:
- 将
*returnSize设为0,释放已分配的内存,返回NULL,符合题目的隐含要求。
修复后的完整代码
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int *ans = (int*)malloc(2*sizeof(int)); *returnSize = 2; for(int i=0; i<numsSize; i++){ for(int j=i+1 ; j<numsSize; j++){ if( nums[i] + nums[j] == target ){ ans[0] = i; ans[1] = j; return ans; // 找到结果直接返回,减少不必要遍历 } } } // 未找到目标时的处理 free(ans); *returnSize = 0; return NULL; }
内容的提问来源于stack exchange,提问作者Leodero20
相关产品推荐
相关产品推荐

