C语言 函数无法返回问题中returnSize数组中的元素

mmvthczy  于 2023-03-01  发布在  其他
关注(0)|答案(3)|浏览(144)

我试图解决一个C编码问题两个和在线编码平台LeetCode我无法返回整数指针大小。
问题:给定一个整数数组,返回两个数的索引,使它们相加得到一个特定的目标。你可以假设每个输入只有一个解,并且你不能使用同一个元素两次。
示例:
给定数值=[2,7,11,15],目标值= 9,
因为数字[0]+数字[1]= 2 + 7 = 9,所以返回[0,1]。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i,j,sum=0,n1=0,n2=0,sz=1;
    int *re;
    re = (int*)malloc(sizeof(returnSize));

    for(i=0;i<numsSize;i++){
        
         if(sum==target){
                break;
         }

         n1 = i;
         for(j=i+1;j<numsSize;j++){
              sum = nums[i]+nums[j];
            
              if(sum==target){
                   n2 = j;
                   re[0] = n1;
                   re[1] = n2;
                   break;
              }
         }  
    }
    
    return re;
}

我预计nums = [2, 7, 11, 15]的输出target = 9[0, 1],但实际输出为]

kulphzqa

kulphzqa1#

该函数的接口设计为提供两部分结果,即数组及其大小。
不应通过覆盖returnSize来返回数组。
您应该通过将返回数组的大小写入指针returnSize所引用的int变量来返回该数组的大小(可能还要检查它是否为NULL指针)。
数组(即新的错位指针)应该通过return返回,当然您也是这样做的,但是通过覆盖返回参数指针来执行此操作会间接导致此处的问题(需要使用mre来跟踪观察到的问题)。
顺便说一句,我发现这只是因为你忽略并覆盖了一个参数,指针,如果这是正确的,那么函数的接口将是低效的,这是可能的,但通常不是挑战。

5f0d552i

5f0d552i2#

我无法重现提供的数组的问题。但无论如何,函数是不正确的。
代替此语句(其中malloc调用的参数没有意义)

re = (int*)malloc(sizeof(returnSize));
                         ^^^^^^^^^^^

应该有

re = (int*)malloc(sizeof( sizeof( int ) * *returnSize ));
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^

尽管参数returnSize是多余的,因为根据您的描述,数组具有等于2的固定大小。
此外,存在未使用的变量sz=1
该函数可以调用未定义的行为,因为在target等于0的情况下,动态分配的数组未被初始化并且具有不确定的值,因为存在循环退出。

for(i=0;i<numsSize;i++){

     if(sum==target){
            break;
        }
    // ...

不需要动态分配数组,可以返回两个元素的结构。
第一个参数应使用限定符const声明。
该函数可以写得更简单、更清晰和可读性更强。

#include <stdio.h>

struct PairIndices
{
    size_t first;
    size_t second;
};

struct PairIndices twoSum( const int *a, size_t n, int target )
{
    struct PairIndices pair = { n, n };

    for ( size_t i = 0; i < n && pair.first == n ; i++ )
    {
        size_t j = 1;

        while ( j < n && a[i] + a[j] != target ) j++;

        if ( j != n )
        {
            pair.first  = i;
            pair.second = j;
        }
    }

    return pair;
}

int main(void) 
{
    int a[] = { 2, 7, 11, 15 };
    const size_t N = sizeof( a ) / sizeof( *a );
    int target = 9;

    struct PairIndices pair = twoSum( a, N, target );

    if ( pair.first != N )
    {
        printf( "a[%zu] + a[%zu] == %d\n", pair.first, pair.second, target );
    }
    else
    {
        printf( "There are no two elements in the array "
                "sum of which is equal to %d\n", target );
    }

    return 0;
}

程序输出为

a[0] + a[1] == 9
vmdwslir

vmdwslir3#

试试这个:

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int *result = malloc(2 * sizeof(int));
    *returnSize=2;
    for(int i=0;i<numsSize;i++)
    {
        for(int j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                result[0]=i;
                result[1]=j;
                return result;
            }
        }
    }
    return result;
}

相关问题