C - 从函数返回数组

C - Returning array from function

我的问题是,我有一个包含 .c 文件的 C 项目:

trab.c
ordena.c
persistencia.c

persistencia.c 是我需要从 .txt 文件中读取 X 个整数的地方

trab.c有主。我必须调用 persistencia.c 来获取 X 数组(由主参数定义)整数并从 ordena.c 调用排序函数将所述数组作为参数传递。

我的问题是。什么是不太完整的方法呢? 我可以声明一个全局数组而不是通过参数传递吗? 我可以使用 malloc 从另一个 class 访问 var 吗?

您可以使用 malloc 分配一个 X int 的数组(我假设您知道并且提前有 #defined X)。

int *array = malloc( X * sizeof(int) );

malloc returns a pointer(一个变量存储在内存中的地址)到数组。如果 X 不是先验已知的,您可以通读文件以确定有多少 int 并添加另一个 int* 参数以告知调用者读取了多少。您可以从 persistencia.c 中的函数 return ptr,只要明确调用者对 free 内存负责即可。函数声明看起来像

int *readInts();

要将数组传递给 ordena.c 中的函数,您可以将其作为 int*

类型的参数
void ordena(int *array, size_t length);

Logan Rakai 有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明 not 比 return 动态分配内存更好(有时不是)。

更灵活的设计是编写一个接受指针和数组大小的函数。

此外,在编写需要维护的长期项目时(可能不仅仅是您自己,也可能由其他程序维护),最好将 "concerns" 放在一起。

一个很好的例子是,当内存管理(free)由调用函数执行时,内存分配(malloc)最好在同一个调用函数中执行。 .. 在不同函数之间拆分内存管理问题时,未来的维护者更有可能将内存泄漏引入代码中。

在这种情况下,使用堆栈或 malloc 分配数组并传递它非常简单。

即,这里有一个快速(有点无用)的示例,用于将内存管理问题转移到调用函数中 (main)。请注意,这允许您在调用数组相关函数时同时使用动态内存分配和堆栈分配。

size_t get_array_size(void /* or any parameters */) {
  /* do whatever you need */
  return 10; /*for our example */
}

void fill_array(int *arry, size_t size) {
  while (size) {
    size--;
    arry[size] = 1; /* fill in data here */
  }
}

int use_array(int *arry, size_t size) {
  fprintf(stderr, "***\n");
  while (size) {
    size--;
    arry[size] -= 1; /* do whatever */
    fprintf(stderr, "array[%lu] == %d\n", size, arry[size]);
  }
  return 0; /* or return -1 for error */
}

int main(int argc, char const *argv[]) {
  int array1[20];
  int *array2;
  size_t array2_size = get_array_size();
  array2 = malloc(sizeof(*array2) * array2_size);
  fill_array(array1, 20);
  fill_array(array2, array2_size);
  if (use_array(array1, 20))
    perror("WTF?! "), exit(0);
  if (use_array(array2, array2_size))
    perror("WTF?! "), exit(0);
  return 0;
}

这是我的 2¢。可能我的错误管理代码有点反常,但是 returning -1 错误比人们相信的更常见。