【问题标题】:Return integer array from function从函数返回整数数组
【发布时间】:2013-05-12 08:40:26
【问题描述】:

我正在尝试从函数返回一个整数数组,对数字进行排序,然后将所有内容传回 main。我没有在这段代码中分配和释放内存。我只是想看看它是否真的有效。编译器为语句b=sort(a) 标记错误。它说它是不可分配的,这是有道理的。输入整数不是指针。有没有办法将整数数组声明为指针?如:

int *a[5]={3,4}

#include <stdio.h>
#include <stdlib.h>
int *sort(int *input_array);

int *sort(int *input_array)
{
    return input_array;
}

int main()
{
    int a[5]={3,4};
    int b[5];
    b=sort(a);
    return 0;
}

【问题讨论】:

标签: c


【解决方案1】:

创建数组时,不能分配给数组本身(仅分配给元素)。此外,由于当您传递一个数组时,您是通过引用传递它,sort() 会修改该数组,使其不需要返回它。

您正在寻找的是:对原始数组进行排序,如下所示:

void sort (int * array);

void sort (int * array) {
  // do stuff on the array
}

int main (void) {
  int a[5] = {1, 46, 52, -2, 33};
  sort(a); // result is still in a
  return 0;
}

或者创建一个副本并对其进行排序,就像这样:

#include <stdlib.h>
#include <string.h>
int * sort (int * array, unsigned size);

int * sort (int * array, unsigned size) {
  int * copy = malloc(sizeof(int) * size);
  memcpy(copy, array, size * sizeof(int));
  // sort it somehow
  return copy;
}

int main (void) {
  int a[5] = {1, 46, 52, -2, 33};
  int * b; // pointer because I need to assign to the pointer itself
  b = sort(a, (sizeof a) / (sizeof *a)); // now result is in b, a is unchanged
  // do something with b
  free(b); // you have to
  return 0;
}

【讨论】:

    【解决方案2】:

    您不能分配数组,它们不是“一等公民”,而是更像指针。

    你需要这样的东西:

    int a[] = { 3, 4 };
    int *b;
    
    b = sort(a, sizeof a / sizeof *a);
    

    需要sizeof 表达式来计算数组的长度,sort() 函数无法从它传递的裸指针中确定这一点。

    更新:以上假设您不会更改输入数组,但如果您这样做(如评论中所指出的,谢谢)返回value 当然不需要,因为当sort() 调用返回时,调用者的a 将发生变化。

    【讨论】:

    • 也就是说,它是就地排序,所以你甚至不需要 b。 a 只是在调用之后排序。
    【解决方案3】:

    如果您传递数组 - int 的指针,则无需返回更改后的数组。您传递的数组将被更改。

    正如@unwind 建议的那样,您还应该将元素数量传递给函数,以便函数知道数组中有多少元素。

    【讨论】:

    • 所以字符数组不能被修改?或者他们会......只是不是变长字符数组?
    • @seasick,很抱歉没有找到你。
    【解决方案4】:

    您不能在 C 中返回包含任何内容的数组。您只能返回单个数据类型的单个实例。

    该数据类型可以是指向存储数字顺序列表(或其他任何内容)的内存的指针,但是您会丢失有关结果多长时间的所有信息,因此您要么需要知道这一点,要么必须拥有另一个值作为一个输出变量来告诉你长度。

    您还可以返回自定义数据类型,例如结构,它既包含数据列表又包含长度。但是,返回大型数据结构会创建数据结构的多个浅表副本,从而减慢程序的执行速度,并造成内存泄漏和多次引用的噩梦。

    但是,返回一个指向自定义数据结构的指针可以很好地工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2011-08-17
      • 2013-05-15
      • 2017-01-26
      • 2014-11-20
      相关资源
      最近更新 更多