C从函数返回数组

时间:2014-05-31 18:39:42

标签: c arrays

在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指针时,它们没有错误,但是当我尝试通过函数返回时,我收到此错误。

请帮忙。

7 个答案:

答案 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)

这里有很多错误。

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

  2. 您正在尝试返回在堆栈上初始化的变量(num_set)。这将 multiply_by_two函数退出后立即消失,因为它是automatic variable。相反,您应该使用malloc函数来分配堆内存。这是一个解释stack and heap memory

  3. 之间差异的链接
  4. 您有一个><中的for循环中应该有一个main。如上所述,循环将立即退出。

  5. 次要 - 在整个代码中,数字10重复多次。最好使用变量或#define为数字赋予有意义的名称

  6. 以下是代码的修订版本:

    #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 *类型。
  •   
  • 您正在返回指向自动局部变量的指针。
  •   
  • formain循环中的第二个表达式不会让循环体执行。
  •   

将函数的返回类型更改为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释放分配的内存。

相关问题