【问题标题】:What is the best way to declare and initialize a 2D array dynamically allocated?声明和初始化动态分配的二维数组的最佳方法是什么?
【发布时间】:2021-04-03 16:58:33
【问题描述】:

我尝试过这种方式,但我不知道这是否是最好的方法:

#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;
}

【问题讨论】:

  • 更具体地说明您担心您的解决方案可能“不是最佳”的原因。
  • 我有疑问是因为我见过一些解决方案,其中每列都分配有 malloc 并使用 memset 初始化(在 for 循环中)。
  • @link23 如果数组在所有维度上的大小都相同,那么您不妨分配一个一维数组并做一些简单的数学运算以获得正确的索引。
  • @Cheatah:1. OP 已经在这样做了。 2.即使不同维度的尺寸不相同,这也成立。

标签: arrays c matrix multidimensional-array dynamic-memory-allocation


【解决方案1】:

(我忽略了您问题标题中的“最佳”一词)

  1. 尝试avoid global variables。如果您在main() 中需要matrix,则在main() 中声明它并根据需要将其传递给其他函数。

  2. 正如@Vlad 的answer 提到的那样——如果你特别想将你的数组设置为零,你可以将你的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] 的形式使用您的矩阵,您仍将使用单个分配 - 但为实际数据分配空间以及一系列指向列开头的指针。

进一步阅读:

【讨论】:

  • 表达式matrix[ROW * COL]是否等于matrix[ROW][COL]?此外,在这种情况下,我不能只写 matrix[ROW * COL] = {0};?
  • @link23:这是个好问题。它大部分是等效的,从某种意义上说,您将获得相同的内存布局。我不推荐它,因为当你传递这样一个“伪 2D-C 矩阵”时,你要么将其作为普通的 int* 传递,要么必须在每个函数的签名中包含 COL 参数。此外,对于列出代码,请使用反引号 (`)。
  • @link23 在这种情况下,matrix2d[x][y] 将等同于 matrix1d[x * ROW + y]matrix1d[x + y * COL];,只要您保持一致并始终使用其中一个或另一个。
【解决方案2】:

矩阵表示为二维数组时处理比较好。

您可以将它们替换为calloc 的调用,而不是手动调用malloc 然后memset

所以你可以在main中写(不需要在文件范围内声明指针)

int ( *matrix )[COL] = calloc( 1, sizeof( int[ROW][COL] ) );

使用这样的数组可以让代码更清晰。例如输出矩阵你可以写

for ( size_t i = 0; i < ROW; i++ )
{
    for ( size_t j = 0; j < COL; j++ )
    {
        printf( "%d ", matrix[i][j] );
    }
    putchar( '\n' );
}

总结一下使用一维数组的困难,想象一下两个矩阵相乘的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2012-01-27
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多