我是LeetCode的新手,正在尝试改进我的问题解决技术。我正在尝试解决C语言中的“两个和”问题,并且在最后的return语句中遇到了麻烦。 LeetCode最初提供给我的代码是一个称为“ int * twoSum”的函数,目标是在数组中查找产生目标编号的两个索引。该函数列出了我认为在main中提供的几个参数,因为未显示。
我将函数的名称更改为“ int twosum”,并删除了int * returnSize,因为我不喜欢不必要的按地址而不是按值传递,并且认为这不会产生重大影响。但是,在尝试运行我的代码后,我遇到了警告错误:“从具有返回类型'int'的函数返回'int *'会使指针的整数不进行强制转换”
请问在LeetCode上了解此问题或已解决问题的人是否可以提供我需要纠正的见解?谢谢。
int twoSum(int *nums, int numsSize, int target){
int outerCount; //loop control variable for outer loop
int innerCount; //loop control variable for inner loop
int array[2]; //array that stores indices of numbers that produce target
for(outerCount = 0; outerCount < numsSize; outerCount++)
for(innerCount = outerCount + 1; innerCount < numsSize; innerCount++)
{
if(nums[outerCount] + nums[innerCount] == target)
{
array[0] = outerCount;
array[1] = innerCount;
}
}
return array;
}
答案 0 :(得分:0)
该问题要求您返回两个整数(索引),因此返回类型int
显然是不正确的。 int
是一个整数;两个返回两个整数,您需要返回int
或包含两个整数成员的struct
数组。 C不允许您按值返回数组,因此,如果需要返回数组,则需要返回int*
。这就是C的方式。
请注意,由于无法按值返回数组,因此也无法返回指向自动分配的数组的指针,因为该对象的生命周期将在函数返回时结束。因此,您需要动态分配数组(除非它作为参数传递给函数,这是一种非常常见的样式)。在这种情况下,很明显,基于注释,需要动态分配的返回值:
/* Note: The returned array must be malloced, assume caller calls free(). */
无论您是否喜欢这种样式,在本练习中都需要遵循该样式,因为很明显,调用者将在返回的指针上调用free()
,并在返回的指针上调用free()
最初不是由malloc
返回的指针是未定义行为(并且很可能使程序崩溃)。 (您可以free(NULL)
,但是这也违反了调用合同,当调用方尝试检查不存在的返回值时,它将违反段规则。)
C确实允许您按值返回struct
,但是如果要返回struct
,则您和调用方需要就其声明达成共识(例如,其成员的名称) )。