LeetCode:两个和(错误:返回数组)

时间:2019-08-08 23:21:21

标签: c arrays pointers

我是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;
}

1 个答案:

答案 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,则您和调用方需要就其声明达成共识(例如,其成员的名称) )。