繁体   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