我正在尝试从函数返回一个整数数组,对数字进行排序,然后将所有内容传递回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;
}
答案 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中返回任何内容的数组。您只能返回单个数据类型的单个实例。
该数据类型可以是存储数字顺序列表(或其他任何内容)的内存指针,但是您丢失了有关结果多长时间的所有信息,因此您需要知道这一点,或者您必须具有其他值作为输出变量来告诉你长度。
您还可以返回一个自定义数据类型,例如结构,它包含数据列表和长度。但是,返回大型数据结构会创建数据结构的多个浅表副本,从而减慢程序的执行速度,同时创建具有泄漏和多个引用的内存噩梦。
然而,返回指向自定义数据结构的指针可以很好地工作。