在C中掌握数组以及如何通过函数返回它们时遇到一些麻烦。如果我做这样的事情
int main()
{
int num_set[10]={0,1}; //initialize first two elements as 0,1 and rest as 0
int* p=num_set; //assign array to int pointer called p
printf("\n%i",&num_set); //outputs 2686660 on my machine
printf("\n%i",&num_set[0]); //also outputs 2686660
printf("\n%i",p); //also outputs 2686660
printf("\n%i",p[1]);* //outputs 0; the same as num_set[1]
}
它按预期工作,但是当我尝试通过另一个函数返回数组时,如下所示
int multiply_by_2(int given_number)
{
int num_set[10];
for(int fun_counter=0; fun_counter<10; fun_counter++)
{
num_set[fun_counter] = (given_number*2) ;
}
return num_set; //return int array num_set to caller
}
int main()
{
int* p = multiply_by_2(300) //assign array returned by function to p
for(int main_counter=0; main_counter>10; main_counter++)
{
printf("\np[%i] = %i"
, i, p[i]);
}
}
我收到错误消息&#34;来自&#39; int&#39;的无效转换到&#39; int *&#39;&#34;
当我将数组分配给第一个代码中的int指针时,它们没有错误,但是当我尝试通过函数返回时,我收到此错误。
请帮忙。
答案 0 :(得分:3)
在C中,您无法按值返回数组。您必须返回要返回的数组的指针。
传递指针和缓冲区大小以存储结果。
答案 1 :(得分:2)
这在很多级别上都是错误的,但是编译错误来自于&#34; multiply_by_2&#34;的声明。你声明它返回一个整数,但是你尝试返回一个指针。
答案 2 :(得分:2)
让我们尝试这样的事情:
int* multiply_by_2(int size, int given_number)
{
int *ip = (int*)malloc(size*sizeof(int)); // dynamically create int x[size]
for(int fun_counter=0; fun_counter < size; fun_counter++)
{
ip[fun_counter] = (given_number*2) ;
}
return ip; //return int array num_set to caller
}
来电者必须free()
返回内存。
int main(int argc, char **argv) {
int *ip = multiply_by_2(3, 2);
// ip points to array {4, 4, 4}
free(ip);
return 0;
}
我们说函数调用者成为返回内存的所有者,这就是您负责稍后调用free()
的原因。
答案 3 :(得分:2)
这里有很多错误。
函数multiply_by_2
的返回类型必须是int*
- 即指向整数的指针。实际返回的是指向数组第一个元素的指针。
您正在尝试返回在堆栈上初始化的变量(num_set
)。这将
multiply_by_two
函数退出后立即消失,因为它是automatic variable。相反,您应该使用malloc
函数来分配堆内存。这是一个解释stack and heap memory
您有一个>
,<
中的for
循环中应该有一个main
。如上所述,循环将立即退出。
次要 - 在整个代码中,数字10重复多次。最好使用变量或#define
为数字赋予有意义的名称
以下是代码的修订版本:
#include <stdio.h>
#include <stdlib.h> //This is required to use malloc
#define ARRAY_SIZE 10
int* multiply_by_2(int given_number)
{
int *num_set =malloc(sizeof(int)*ARRAY_SIZE);
for(int fun_counter=0; fun_counter<ARRAY_SIZE; fun_counter++)
{
num_set[fun_counter] = (given_number*2) ;
}
return num_set; //return int array num_set to caller
}
int main()
{
int* p = multiply_by_2(300); //assign array returned by function to p
for(int i=0; i<ARRAY_SIZE; i++)
{
printf("\np[%i] = %i", i, p[i]);
}
free(p);
}
答案 4 :(得分:1)
int multiply_by_2(int given_number) // not returning an array, but just an int
您的函数的返回类型为int
,因此在尝试将其分配给int *
时会出错。将其更改为以下内容:
int* multiply_by_2(int given_number)
此更改是可以接受的,因为在C中,int
的数组可与指向int
的指针互换。
答案 5 :(得分:1)
你的标题错了。应该是
int* multiply_by_2(int given_number)
您需要返回int的指针,而不仅仅是int。
另一件事,在函数multiply_by_2
中创建了本地数组。这意味着在函数结束后将删除该数组。
您必须使用动态分配(malloc和free)。
答案 6 :(得分:1)
您的计划中的三个主要问题:
- 函数的返回类型为
int
,但您返回int *
类型。- 您正在返回指向自动局部变量的指针。
for
中main
循环中的第二个表达式不会让循环体执行。
将函数的返回类型更改为int *
并使用动态分配。
int* multiply_by_2(int given_number)
{
int* num_set = malloc(sizeof(int)*10);
// rest of you code
}
最后将for
中的main
循环中的第二个表达式更改为main_counter < 10
。使用free
中的main
释放分配的内存。