簡體   English   中英

分配從文件讀取的二維尺寸數組

[英]Allocating 2D array of dimensions read from file

我想從文本文件中讀取2個數字n,m ,然后分配具有n行和m列的2D數組。

另外,我想在main函數中初始化數組,以便稍后在其他函數中使用它,並在另一個函數中進行讀取和分配,這將從main函數中調用。

我知道如何處理讀數,但是我在數組分配方面苦苦掙扎。

我在這里已經讀了很多類似問題的答案,但是它們並沒有幫助我。

我已經編寫了以下代碼,但不確定如何繼續執行以獲得所需的結果:

void func(int** array, int* rows, int* cols){
  int n, m;
  FILE *file;
  fp = fopen("test.txt", "r");
    if (file) {
    /* reading numbers n and m */
    *rows = n;
    *cols = m;
    **array = (int*)malloc(n * m * sizeof(int));
    fclose(file);
  }
}

int main() {      
  int rows, cols;
  int** array;
  func(&array, &rows, &cols);
  return 0;
}

我想也許我應該先用calloc分配一個2D數組,然后在讀取n,m之后再使用realloc ,但是不確定這是否是最佳實踐。

根據從文本文件讀取的尺寸分配2D數組的最佳實踐是什么?

首先是這里最大的釘子:

  • 您的函數的函數簽名中沒有任何類型 -編譯器應拒絕此類型
  • 2D陣列是一樣的指針數組
  • &&是什么意思? &是某物的地址 ,其結果不能有地址,因為它沒有存儲在任何地方,因此這沒有任何意義

如果要動態分配實際的2D數組,則需要固定第二維或將VLA(在C11中是可選的,但假設支持非常安全)與變量一起使用。 像這樣:

// dimensions in `x` and `y`, should be of type `size_t`
int (*arr)[x] = malloc(y * sizeof *arr);

無論如何,第二維是該類型的一部分,因此您的結構將無法工作-調用代碼必須知道此第二維才能傳遞有效的指針。


提示:第一部分不再適用於該問題,OP忘記提及他僅對C90感興趣。 我添加了適當的標簽,但將答案的上部留作參考。 以下內容也適用於C90:


您在代碼中寫入int ** ,這將是一個指向指針的指針。 您可以通過使用指向指針的指針來創建可以用作 2D數組的對象,但是,您不能將其分配為單個塊。

外層指針將指向一個指針數組(例如,“行指針”),因此對於這些指針中的每一個,您都必須分配一個實際值數組。 看起來可能如下所示:

// dimensions again `x` and `y`
int **arr = malloc(y * sizeof *arr);
for (size_t i = 0; i < y; ++i)
{
    arr[i] = malloc(x * sizeof **arr);
}

請注意,這兩個片段都是最小的示例。 對於真實代碼, 您必須每次檢查malloc()的返回值 失敗時可能返回空指針


如果您想在沒有VLA的情況下擁有連續的內存塊,那么最后可以選擇僅使用常規數組並自己計算索引,例如:

int *arr = malloc(x * y * sizeof *arr);

// access arr[8][15] when x is the second dimension:
arr[x*8 + 15] = 24;

這將生成(大致)與真實2D數組相同的可執行代碼,但是在您的源代碼中看起來當然不是那么好。


請注意,這僅是直接回答您的直接問題。 您的代碼包含更多的傻瓜。 您應該真正啟用一組合理的編譯器警告(例如,使用gccclang ,使用-Wall -Wextra -pedantic -std=c11標志),然后修復在繼續進行項目時收到的每一個警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM