簡體   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