【问题标题】:C Returning an array from a functionC从函数返回一个数组
【发布时间】:2014-05-31 18:39:41
【问题描述】:

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

请帮忙。

【问题讨论】:

  • 您已声明 multiply_by_2 返回 int,但您正尝试返回 int[10]
  • @Andro47 现在为什么不能编译?
  • 不能在 C 中返回数组。
  • 至于你的问题,Oli 解释了为什么它不能编译,但我真的不明白你想要做什么。

标签: c arrays


【解决方案1】:

在 C 中,您不能按值返回数组。您必须返回要返回的数组的指针。

传递一个指针和一个缓冲区大小来存储你的结果。

【讨论】:

    【解决方案2】:

    这里有很多错误。

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

    2. 您正试图返回一个在堆栈上初始化的变量 (num_set)。这将 只要multiply_by_two 函数退出,它就会消失,因为它是automatic variable。相反,您应该使用malloc 函数来分配堆内存。这是一个解释stack and heap memory之间区别的链接

    3. 您有一个&gt;,而mainfor 循环中应该有一个&lt;。正如所写,循环将立即退出。

    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);
    }
    

    【讨论】:

    • 了解变量如何存储在内存中以及 malloc 语法真的很有趣。我有点困惑为什么我可以返回像this 这样的变量。变量 t 不应该在 random_function 退出后被清除吗?
    【解决方案3】:

    这在很多层面上都是错误的,但编译器错误来自您对“multiply_by_2”的声明。你声明它返回一个整数,然后你尝试返回一个指针。

    【讨论】:

      【解决方案4】:

      让我们尝试这样的事情:

      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()

      【讨论】:

        【解决方案5】:
        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 中,ints 数组可以与指向 int 的指针互换。

        【讨论】:

          【解决方案6】:

          你的标题是错误的。应该是
          int* multiply_by_2(int given_number)
          您需要返回 int 的 pointer,而不仅仅是 int。

          另外,在函数multiply_by_2 中,您已经创建了本地数组。这意味着该数组将在函数结束后被删除。 您必须使用动态分配(malloc 和 free)。

          【讨论】:

            【解决方案7】:

            你程序的三大问题:

            • 函数的返回类型是int,但您返回的是int * 类型。
            • 您正在返回指向自动局部变量的指针。
            • for 循环中的第二个表达式main 不会让循环体执行。

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

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

            最后将main 中的for 循环中的第二个表达式更改为main_counter &lt; 10。在main 中使用free 来释放分配的内存。

            【讨论】:

              猜你喜欢
              • 2023-04-08
              • 2014-09-16
              • 2021-10-01
              • 2012-04-01
              • 2011-06-23
              • 2021-12-30
              • 2023-01-18
              • 2019-09-06
              • 1970-01-01
              相关资源
              最近更新 更多