【问题标题】:C99 - Conceptual understanding of 2D Array assignmentC99 - 二维数组分配的概念理解
【发布时间】:2020-03-21 08:57:00
【问题描述】:

我试图在 C 中寻找在堆上分配二维数组的方法,但遇到了以前从未见过的东西。我通常分配二维数组的方法是创建一个指针数组,然后用指向其他数组的指针填充该数组。我想了解的是这条线

int (*array)[cols] = malloc(rows * sizeof(*array));

这是我目前对它的理解:

1) 我们在堆上为我们想要的所有行分配一些空间,乘以单个列的大小。

2) malloc() 然后返回一个指向堆上该地址的指针,然后我们将其分配给 (*array)?

我的困惑主要源于 (*array) 的使用。有人可以告诉我为什么我们可以在这种情况下使用 (*array) 吗?另外,为什么sizeof(*array) 会返回每列的大小(以字节为单位)?

【问题讨论】:

    标签: c arrays pointers multidimensional-array malloc


    【解决方案1】:

    代码使用指向可变长度数组 (VLA) 的指针,并为 rows 行分配足够的内存(将一行的大小乘以行数,sizeof(*array))。我假设rowscols 都是变量,而不是常量。 (常量名称通常全部大写:例如ROWSCOLS。)

    赋值给array,而不是*array——它正式是初始化,而不是赋值。 * 是类型的一部分;这是array 的声明(和定义)。带强制括号的符号是您如何在 C 中声明或定义指向数组的指针:

    int (*array)[cols];
    

    这也是指向int 大小为cols 的数组的指针的合法定义。然后你可以分配给它:

    array = malloc(rows * sizeof(array[0]));
    

    或:

    array = malloc(rows * sizeof(*array));
    

    指针指向数组的第 0 行,因此您现在可以使用如下代码来访问数据:

    for (int r = 0; r < rows; r++)
    {
        for (int c = 0; c < cols; c++)
            array[r][c] = rand() % 128;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多