8

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

4 回答 4

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;
}
于 2013-05-17T08:32:03.967 回答
5

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

你需要类似的东西:

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

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

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

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

于 2013-05-17T08:29:12.390 回答
1

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

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

于 2013-05-17T08:29:52.093 回答
1

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

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

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

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

于 2013-05-17T08:32:38.827 回答