[英]What is the best way to declare and initialize a 2D array dynamically allocated?
我嘗試過這種方式,但我不知道這是否是最好的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 5
#define COL 5
int *matrix;
int main(int argc, const char * argv[])
{
matrix = malloc(ROW * COL * sizeof(int));
memset(matrix, 0, ROW * COL * sizeof(int));
return 0;
}
(我忽略了您問題標題中的“最佳”一詞)
盡量避免全局變量。 如果您需要main()
中的matrix
,則在main()
() 中聲明它並根據需要將其傳遞給其他函數。
正如@Vlad 的回答所提到的——如果你特別想將你的數組設置為零,你可以將你的malloc()
和memset()
調用組合成一個calloc()
(“clear-allocate”,如果你願意的話)調用。
如果您事先知道矩陣尺寸,您可能只需在堆棧上分配矩陣,例如:
int main(int argc, const char * argv[]) { int matrix[ROW * COL] = { 0 }; // etc. etc. }
(這也應該將整個數組設置為零。)
另一方面,如果矩陣非常大,那么即使對於先驗已知的維度,動態分配也更有意義,因為堆棧空間是有限的。
使用malloc()
分別分配每一列或每一行並不是一個好主意。 即使您希望您的矩陣以matrix[i][j]
形式使用,您仍然會使用單個分配 - 但為實際數據分配空間以及指向列開頭的指針序列。
進一步閱讀:
當矩陣表示為二維數組時,最好處理它。
除了手動調用malloc
和memset
之外,您還可以將它們替換為calloc
的調用。
所以你可以在main中寫(不需要在文件范圍內聲明指針)
int ( *matrix )[COL] = calloc( 1, sizeof( int[ROW][COL] ) );
使用這樣的數組可以使代碼更加清晰。 例如到 output 矩陣你可以寫
for ( size_t i = 0; i < ROW; i++ )
{
for ( size_t j = 0; j < COL; j++ )
{
printf( "%d ", matrix[i][j] );
}
putchar( '\n' );
}
總結一下使用一維數組的困難,想象一下兩個矩陣相乘的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.