如何在此函数中malloc此数组并将数组返回到主函数?
以下是leetcode中的一个问题:Two Sum问题,其中应通过数组中任意2个元素的和来实现特定的目标值,并且两个元素的索引应存储在返回数组中,返回数组应进行malloced并返回 我收到一个错误,因为如何在此函数中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
“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.更正。谢谢。