簡體   English   中英

聲明和初始化動態分配的二維數組的最佳方法是什么?

[英]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;
}

(我忽略了您問題標題中的“最佳”一詞)

  1. 盡量避免全局變量 如果您需要main()中的matrix ,則在main() () 中聲明它並根據需要將其傳遞給其他函數。

  2. 正如@Vlad 的回答所提到的——如果你特別想將你的數組設置為零,你可以將你的malloc()memset()調用組合成一個calloc() (“clear-allocate”,如果你願意的話)調用。

  3. 如果您事先知道矩陣尺寸,您可能只需在堆棧上分配矩陣,例如:

     int main(int argc, const char * argv[]) { int matrix[ROW * COL] = { 0 }; // etc. etc. }

    (這也應該將整個數組設置為零。)

    另一方面,如果矩陣非常大,那么即使對於先驗已知的維度,動態分配也更有意義,因為堆棧空間是有限的。

  4. 使用malloc()分別分配每一列或每一行並不是一個好主意。 即使您希望您的矩陣以matrix[i][j]形式使用,您仍然會使用單個分配 - 但為實際數據分配空間以及指向列開頭的指針序列。

進一步閱讀:

當矩陣表示為二維數組時,最好處理它。

除了手動調用mallocmemset之外,您還可以將它們替換為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.

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