如何用指针初始化空C数组并正确返回两数之和问题的结果数组?
修复两数之和C语言代码的返回数组问题
你的代码存在的核心问题
- 数组定义错误:main函数里
int* nums[4]是指针数组,并非普通整数数组,应改为int nums[4]。 - returnSize用法误解:题目中
int* returnSize的作用是告诉调用者返回数组的长度(本题固定为2),不是用来存储结果的容器。你需要手动分配内存来存放找到的两个索引。 - 循环逻辑缺陷:内层循环j从0开始会重复检查
i=j的情况(即元素自身相加),且找到符合条件的索引后未终止外层循环,会继续遍历无效数据。应让j从i+1开始,避免重复计算。 - 返回值错误:你需要返回自己分配的结果数组,而非returnSize指针。
- main函数接收与打印错误:接收返回值的变量应为指针类型,打印时需输出结果数组的两个元素;
free(myArray)中的myArray未定义,应释放返回的结果数组。
修正后的代码
#include <stdio.h> #include <stdlib.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize) { // 告诉调用者返回数组的长度为2 *returnSize = 2; // 分配能存储两个整数的内存空间 int* result = (int*)malloc(sizeof(int) * 2); if (result == NULL) { // 内存分配失败时,将返回长度设为0并返回NULL *returnSize = 0; return NULL; } for (int i = 0; i < numsSize; i++) { // j从i+1开始,避免重复检查同一元素相加的情况 for (int j = i + 1; j < numsSize; j++) { if (nums[i] + nums[j] == target) { result[0] = i; result[1] = j; // 找到结果后直接返回,终止所有循环 return result; } } } // 未找到符合条件的数时,释放已分配内存,返回长度设为0并返回NULL free(result); *returnSize = 0; return NULL; } int main() { int nums[4] = {2,7,11,15}; int numsSize = 4; int returnSize; int target = 9; int* result = twoSum(nums, numsSize, target, &returnSize); if (result != NULL && returnSize == 2) { printf("结果: %d, %d\n", result[0], result[1]); // 释放动态分配的内存,避免内存泄漏 free(result); } else { printf("未找到符合条件的两个数\n"); } return 0; }
关键说明
- 内存管理:用
malloc分配结果数组的内存,确保返回的数组在main函数中可访问;使用完毕后必须用free释放,避免内存泄漏。 - returnSize的正确用法:通过
*returnSize = 2明确告知调用者返回数组的元素数量,未找到结果时将其设为0。 - 循环优化:j从
i+1开始,减少一半的循环次数,同时避免检查同一元素相加的无效情况(除非题目允许,否则两数之和默认要求两个不同元素)。
内容的提问来源于stack exchange,提问作者Bruna Naian Moreira Lima Garci
相关产品推荐
相关产品推荐

