C - 从函数返回数组

时间:2016-09-16 02:33:30

标签: c arrays global param

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

trab.c
ordena.c
persistencia.c

persistencia.c我需要从.txt文件中读取X整数

trab.c有主要内容。我必须调用persistencia.c来获取一个X数组(由main中的param定义)整数和调用排序函数ordena.c将所述数组作为参数传递。

我的问题是。做得不那么简单的方法是什么? 我可以声明一个全局数组而不是通过参数传递吗? 我可以使用malloc从另一个类中获取var吗?

2 个答案:

答案 0 :(得分:3)

您可以使用malloc分配一个X int的数组(假设您知道并预先提前#define d X)。

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

malloc向数组返回pointer(存储地址的变量)。如果X不熟悉,则可以通读该文件以确定有多少int个,并添加另一个int*参数,以便向调用者传入已读取的数量。你可以从persistencia.c中的函数返回ptr,只要它明确是调用者对free内存的责任。函数声明看起来像

int *readInts();

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

void ordena(int *array, size_t length);

答案 1 :(得分:0)

Logan Rakai有一个很好的答案,但是,我希望提供一种不同的方法,因为我的经验表明,在可能的情况下(有时不是),返回动态分配的内存会更好

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

此外,在编写需要维护的长期项目时(可能不仅仅是由您自己,而是由其他程序),最好将“关注点”保持在一起。

一个很好的例子是当调用函数执行内存管理(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¢。我的错误管理代码可能有些不正常,但对错误返回-1更常见,人们会相信。