繁体   English   中英

C - 从函数返回数组

[英]C - Returning array from function

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

trab.c
ordena.c
persistencia.c

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

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

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

你可以使用malloc来分配一个X int数组(我假设你知道并提前有#define d X)。

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

malloc将一个指针 (一个存储地址在内存中的变量)返回给数组。 如果X不知道apriori,你可以通读文件来确定有多少int ,并添加另一个int*参数,以通信给调用者读取了多少。 您可以从persistencia.c中的函数返回ptr,只要很明显调用者有责任free内存。 函数声明看起来像

int *readInts();

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

void ordena(int *array, size_t length);

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更常见于人们会相信。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM