题目
暴力遍历
int* twoSum(int* nums, int numsSize, int target, int* returnSize) { // 创建一个数组来存储结果索引 int* indices = (int*)malloc(2 * sizeof(int)); if (indices == NULL) { // 如果内存分配失败,返回 NULL *returnSize = 0; return NULL; } for (int i = 0; i < numsSize; i++) { for (int j = i + 1; j < numsSize; j++) { // 从 i+1 开始,避免重复和自身相加 if (nums[i] + nums[j] == target) { indices[0] = i; indices[1] = j; *returnSize = 2; // 设置返回数组的大小 return indices; // 返回索引数组 } } } // 如果没有找到解,释放已分配的内存并返回 NULL free(indices); *returnSize = 0; return NULL;
}
Q1
在创建数组并对数组进行初始化时使用的是显式初始化
int indices[2] ={0};
但是当函数返回时,局部数组的生命周期结束,其内存将被释放或重用。这意味着返回的指针将指向不确定的内存,也就是我们常说的野指针。因此无法正常返回数据。
A1
修改为使用动态内存分配来创建一个数组,使得该数组在函数外部也是有效的。从而可以返回
int* indices = (int*)malloc(2 * sizeof(int));
Q2
在对第二个符合条件的数时进行遍历,可能会重复与自身相加。
for (int j = 0; j < numsSize; j++)
这里需要更改为
// 从 i+1 开始,避免重复和自身相加
for (int j = i + 1; j < numsSize; j++)