繁体   English   中英

C从函数返回数组

[英]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()的原因。

这里有很多错误。

  1. 函数multiply_by_2的返回类型必须为int* -即指向整数的指针。 实际返回的是指向数组第一个元素的指针。

  2. 您试图返回在堆栈上初始化的变量( num_set )。 这将尽快消失multiply_by_two函数退出,因为它是一个自动变量 相反,应该使用malloc函数分配堆内存。 这是解释堆栈和堆内存之间区别的链接

  3. 您有一个> ,在main中的for循环中应该有一个< 如所写,循环将立即退出。

  4. 次要点-数字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 *类型。
  • 您正在将指针返回到自动局部变量。
  • mainfor循环中的第二个表达式不会让循环主体执行。

将函数的返回类型更改为int *并使用动态分配。

int* multiply_by_2(int given_number)
{
     int* num_set = malloc(sizeof(int)*10);
     // rest of you code
}

最后将mainfor循环中的第二个表达式更改为main_counter < 10 main使用free释放已分配的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM