从函数返回整数数组

时间:2013-05-17 08:26:48

标签: c

我正在尝试从函数返回一个整数数组,对数字进行排序,然后将所有内容传递回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;
}

4 个答案:

答案 0 :(得分:12)

创建数组时,无法分配给数组本身(仅限于元素)。此外,因为当你传递一个数组时,你通过引用传递它,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;
}

答案 1 :(得分:5)

你不能分配数组,它们不是“一等公民”,而是表现得像指针一样。

您需要以下内容:

int a[] = { 3, 4 };
int *b;

b = sort(a, sizeof a / sizeof *a);

计算数组的长度需要sizeof表达式,sort()函数无法通过传递的裸指针确定它。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

然而,返回指向自定义数据结构的指针可以很好地工作。