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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:06:23