如何在此函数中malloc此数组并将数组返回到主函数?

如何在此函数中malloc此数组并将数组返回到主函数?,c,arrays,malloc,C,Arrays,Malloc,以下是leetcode中的一个问题:Two Sum问题,其中应通过数组中任意2个元素的和来实现特定的目标值,并且两个元素的索引应存储在返回数组中,返回数组应进行malloced并返回 我收到一个错误,因为“ret被重新声明为不同类型的符号” /** * Note: The returned array must be malloced, assume caller calls free(). */ int *twoSum(int *nums, int numsSize, int targe

以下是leetcode中的一个问题:Two Sum问题,其中应通过数组中任意2个元素的和来实现特定的目标值,并且两个元素的索引应存储在返回数组中,返回数组应进行malloced并返回

我收到一个错误,因为
“ret被重新声明为不同类型的符号”

/**
  * Note: The returned array must be malloced, assume caller calls free().
 */
int *twoSum(int *nums, int numsSize, int target, int *ret) {
    int i, j;
    int *ret = (int *)malloc(sizeof(int) * 2);
    for (i = 0; i < numsSize; i++) {
        for (j = i + 1; j < numsSize; j++) {
            if (nums[i] + nums[j] == target) {
                ret[0] = i;
                ret[1] = j;
            }
        }
    }
    return ret;
}
/**
*注意:返回的数组必须是malloced,假设调用方调用free()。
*/
int*twoSum(int*nums、int-numsize、int-target、int*ret){
int i,j;
int*ret=(int*)malloc(sizeof(int)*2);
对于(i=0;i
ret
作为函数
twoSum
的输入变量。 您正在第2行重新说明
ret

int*ret=(int*)malloc(sizeof(int)*2)

相反,您应该稍后对其进行分配:


ret=(int*)malloc(sizeof(int)*2)

错误是因为您在
twoSum
函数中声明了两次

int *twoSum(int *nums, int numsSize, int target)
{
    int i, j;
    int *ret = malloc(sizeof(int) * 2);
    if (!ret) return NULL;

    /* In case, no such indexes are found. */
    ret[0] = -1;
    ret[1] = -1;

    for(i = 0;i < numsSize; i++)
    {
        for(j = i+1; j < numsSize; j++)
        {
            if(nums[i] + nums[j] == target)
            {
                ret[0] = i;
                ret[1] = j;
            }
        }
    }
    return ret;
}
参数
ret
在任何情况下都是一个麻烦,因为您不能向它分配(即不能通过传递的指针返回)调用者可以使用的已分配指针,因为参数是通过C中的值传递的(有关此方面的更多信息,请参阅)。由于要返回指针,只需删除参数并重写函数

int *twoSum(int *nums, int numsSize, int target)
{
    int i, j;
    int *ret = malloc(sizeof(int) * 2);
    if (!ret) return NULL;

    /* In case, no such indexes are found. */
    ret[0] = -1;
    ret[1] = -1;

    for(i = 0;i < numsSize; i++)
    {
        for(j = i+1; j < numsSize; j++)
        {
            if(nums[i] + nums[j] == target)
            {
                ret[0] = i;
                ret[1] = j;
            }
        }
    }
    return ret;
}
int*twoSum(int*nums、int-numsize、int-target)
{
int i,j;
int*ret=malloc(sizeof(int)*2);
如果(!ret)返回NULL;
/*在这种情况下,找不到此类索引*/
ret[0]=-1;
ret[1]=-1;
对于(i=0;i
如前所述,您有两个声明
ret
。参数列表中的一次

int* twoSum(int* nums, int numsSize, int target, int* ret)
另一个网址是:

int *ret = malloc(sizeof(int)*2);
除了来自中国的建议之外,还有另一种可能的方法

如果您想在调用方中提供一个指针,函数
twoSum
中分配的动态内存将指向该指针,请将
ret
声明为
int**
,并取消引用
ret
以根据分配内存的地址分配调用方中的指针

不要忘记通过检查
malloc()
中返回的
NULL
指针来检查分配是否成功

malloc()
返回的指针不需要强制转换

void twoSum (int* nums, int numsSize, int target, int** ret){

     int i,j;
     *ret = malloc(sizeof(int)*2);

     if (*ret == NULL)
     {
         fputs("Allocation failed!",stderr);
         exit(1);     
     }

     for(i = 0; i < numsSize; i++)
     {
         for(j = i + 1; j < numsSize; j++)
         {
             if(nums[i] + nums[j] == target)
             {
                 (*ret)[0] = i;
                 (*ret)[1] = j;
             }
         }
     }
     return;
}

ret
在函数
twoSum
中有效声明两次:

  • 作为类型为
    int*
  • 作为具有相同类型的局部变量
该错误令人困惑,因为两个声明的类型相同,但它仍然是一个错误

请注意,函数
twoSum
应该只更新它获取指针
ret
的数组,并返回
1
表示成功,返回
0
表示失败,或其他约定。即使找到了解决方案,发布的版本也会继续搜索解决方案,即使没有找到解决方案,也会始终返回
ret
。打电话的人无从得知

以下是修改后的版本:

/**
*注意:调用方必须传递指向2 int数组的指针
*如果找到解决方案,则返回值为1,否则返回值为0
*/
int twoSum(int const*nums、int numsize、int target、int*ret){
int i,j;
对于(i=0;i
您有了参数
ret
,然后还定义了局部变量
ret
。删除其中一个。关于:
int*ret=(int*)malloc(sizeof(int)*2)1)确保有以下语句:
#include
2)返回的类型是
void*
,可以分配给任何指针。强制转换只会使代码变得混乱,并且容易出错。建议去掉那个石膏。3) 始终检查(!=NULL)返回值以确保操作成功。如果未成功(=NULL),则调用
perror(“您的错误消息”)
输出错误消息和系统认为错误发生在
stderr
的文本原因。关于语句:
for(i=0;iOT:About:
int i,j;
这是将这些变量的“范围”设置为
文件范围。
。但是,良好的编程实践是限制变量的“范围”。建议删除该行并修改:
(i=0;i@BShan:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。关于:
(*ret)[0]=i;(*ret)[1]=i;
这应该是:
(*ret)[0]=i;(*ret)[1]=j;
所以设置
i
j
@user3629249 uhh.Thinko.更正。谢谢。