求解两数之和时触发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
相关产品推荐
相关产品推荐

