[英]C Returning an array from a function
而且在使用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]);
}
}
我收到一条错误消息:“从'int'到'int *'的转换无效”
当我在第一个代码中将数组分配给int指针时,它们没有错误,但是当我尝试通过函数将其返回时,却出现了此错误。
请帮忙。
在C语言中,您无法按值返回数组。 您将必须返回要返回的数组的指针。
传递指针和缓冲区大小以存储结果。
在许多级别上这都是错误的,但是编译器错误来自您的声明“ multiply_by_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()
的原因。
这里有很多错误。
函数multiply_by_2
的返回类型必须为int*
-即指向整数的指针。 实际返回的是指向数组第一个元素的指针。
您试图返回在堆栈上初始化的变量( num_set
)。 这将尽快消失multiply_by_two
函数退出,因为它是一个自动变量 。 相反,应该使用malloc
函数分配堆内存。 这是解释堆栈和堆内存之间区别的链接
您有一个>
,在main
中的for
循环中应该有一个<
。 如所写,循环将立即退出。
次要点-数字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);
}
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
s数组可以与一个指向int
的指针互换。
您的标题错误。 应该
int* multiply_by_2(int given_number)
您需要返回int的指针 ,而不仅仅是int。
另一件事,在multiply_by_2
函数中,您创建了本地数组。 这意味着该函数结束后将删除该数组。 您必须使用动态分配(malloc和free)。
程序中的三个主要问题:
- 函数的返回类型为
int
但您返回的是int *
类型。- 您正在将指针返回到自动局部变量。
main
中for
循环中的第二个表达式不会让循环主体执行。
将函数的返回类型更改为int *
并使用动态分配。
int* multiply_by_2(int given_number)
{
int* num_set = malloc(sizeof(int)*10);
// rest of you code
}
最后将main
的for
循环中的第二个表达式更改为main_counter < 10
。 在main
使用free
释放已分配的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.