[英]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數組,則需要固定第二維或將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數組相同的可執行代碼,但是在您的源代碼中看起來當然不是那么好。
請注意,這僅是直接回答您的直接問題。 您的代碼包含更多的傻瓜。 您應該真正啟用一組合理的編譯器警告(例如,使用gcc
或clang
,使用-Wall -Wextra -pedantic -std=c11
標志),然后修復在繼續進行項目時收到的每一個警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.