我是 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;
}
这是错误:
第 207 行:字符 3:运行时错误:加载类型“int”的未对齐地址 0x000000000001,需要 4 字节对齐 [Serializer.c] 0x000000000001:注意:指针指向这里
据我对指针的理解:
*ans[0] = i
应该将 i 的值(一个整数)赋给指针 ans[0] 指向的值。但是,这会给出错误“错误:一元‘*’的类型参数无效(有‘int’)”。所以,我尝试了上面的代码。所以,我需要的帮助是更多地了解指针。非常感谢!
如果 C 中有一个指针
int* ptr
,您可以使用运算符 *
(如 *ptr
)取消引用它(获取它所指向的对象)。或者,如果为多个对象分配了内存(例如通过 malloc()
),您可以使用 *(ptr + i)
获取每个对象,其中 i
代表您要检索的对象的偏移量。但是,如果 i
为负数或大于/等于您为其分配内存的对象数量,则您将超出边界访问内存,这是未定义的行为,并可能导致分段错误。
由于写
*(ptr + i)
有点难看且难以阅读,您可以使用 ptr[i]
代替,它的作用是一样的。
应该分配 i 的值*ans[0] = i
您可以使用
*ans = i
或 *(ans + 0) = i
或 ans[0] = i
来获得工作结果。所有这三个选项的作用都是相同的,但我更喜欢最后一个,因为您有一个数组,而不仅仅是指针指向的单个元素。 (如果它只是一个,你应该使用 *ans
以便于阅读和理解它不是一个数组。)
应该返回数组 [i,j]return *ans
同样的问题又来了。当您像
*ans
那样取消引用它时,您不会返回整个数组,而只会返回它指向的第一个对象,即整数 i
。相反,你应该return ans;
。
在内部
for
循环中,您使用 int j=i++
,它将 j
设置为 i
,然后将 i
加 1。这不是您想要的行为,因为它会使 i
跳过整个迭代,这可能导致您跳过您正在寻找的值。对于第一次迭代, i
和 j
是相同的,但 问题 表明情况不应该如此。所以你可以在你的内部 int j = i + 1
循环中使用 for
。
您的其余代码应该可以工作,但可以稍微改进。我想您想在
for
中的 break
语句中退出两个 if
循环? break
仅存在内部循环,这不会给您带来错误的结果,因为问题描述指出“仅存在一个有效答案”,但您可以直接 return ans;
立即退出。否则,您可以使用一些附加变量或 goto
跳转到函数末尾。
并且您不会检查
malloc()
返回给您的内容。如果它返回 NULL
(尽管这可能不会发生),那么当您尝试取消引用 ans
时,您的程序将崩溃。
这个问题并没有说明如果你没有找到一对有效的答案应该发生什么,但我认为“只有一个有效的答案存在”意味着总是有一个有效的答案,不多也不少。我假设我的解决方案可能找不到一对,并且仅分配
ans
并将 *returnSize
设置为 2
如果我确实找到了一个。
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
*returnSize = 0;
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
int* ans = malloc(2 * sizeof(int));
if (ans != NULL) {
*returnSize = 2;
ans[0] = i;
ans[1] = j;
}
return ans;
}
}
}
return NULL;
}