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

求解两数之和时触发int类型空指针加载运行时错误

解决twoSum函数中的空指针加载运行时错误

看起来你遇到的空指针错误根源在于对returnSize参数的理解和使用错误,这个参数是输出参数,用来告诉调用者你返回的数组有多大,而不是让你读取它的输入值。咱们一步步来修复这个问题:

问题分析

  • 你现在的代码里先检查*returnSize <=0 || *returnSize>16,但如果调用者没有初始化returnSize指向的变量,或者传入了一个无效的指针,这里就会直接触发空指针加载的运行时错误。
  • returnSize的正确用法是:当找到符合条件的索引时,你需要把它的值设为2(因为返回两个索引);如果没找到,就设为0。
  • 另外,你用*returnSize来决定malloc的大小也不对,因为题目明确要求返回两个数的索引,所以固定分配2个int的空间就可以了。

修正后的代码

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    // 先检查输入参数的有效性
    if (nums == NULL || numsSize < 2 || returnSize == NULL) {
        if (returnSize != NULL) {
            *returnSize = 0; // 确保调用者能拿到正确的返回大小
        }
        printf("Invalid arguments passed.");
        return NULL;
    }

    int i, j;
    int *returnIndex = NULL;

    for (i = 0; i < numsSize; i++) {
        for (j = i + 1; j < numsSize; j++) {
            if (nums[i] + nums[j] == target) {
                // 分配固定大小的内存,因为要返回两个索引
                returnIndex = (int *)malloc(2 * sizeof(int));
                if (returnIndex == NULL) {
                    printf("\nCould not allocate memory.\n");
                    *returnSize = 0;
                    return NULL;
                }
                returnIndex[0] = i;
                returnIndex[1] = j;
                *returnSize = 2; // 告诉调用者返回数组的长度是2
                return returnIndex;
            }
        }
    }

    // 没找到匹配的情况,设置返回大小为0
    *returnSize = 0;
    return NULL;
}

关键修改点说明

  • 修正returnSize的使用:移除了对*returnSize的前置检查,改为在函数结束时(无论成功还是失败)给它赋值,确保调用者能正确获取返回数组的长度。
  • 固定malloc的大小:因为题目要求返回两个索引,所以直接分配2 * sizeof(int)的空间,不用依赖returnSize的初始值。
  • 增强参数检查:把numsSize == 0改成numsSize < 2,因为至少需要两个元素才能找到和为目标的两个数。
  • 错误处理完善:在所有可能返回NULL的路径上,都确保给*returnSize赋值为0,避免调用者处理空指针时还不知道数组大小。

这样修改后,你的代码就不会再触发空指针加载的错误,同时也符合题目对返回值的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:00:59