我试图寻找在 C 中的堆上分配 2D 数组的方法,但我遇到了以前从未见过的东西。我分配 2D 数组的常用方法是创建一个指针数组,然后用指向其他数组的指针填充该数组。我想理解的是这条线
int (*array)[cols] = malloc(rows * sizeof(*array));
以下是我目前对它的理解:
1(我们在堆上为我们想要的所有行分配一些空间,乘以单列的大小。
2(然后malloc()
返回一个指向堆上这个地址的指针,然后我们将其分配给(*array(?
我的困惑主要源于(*array(的使用。有人可以告诉我为什么我们可以在这种情况下使用(*array(吗?另外,为什么sizeof(*array)
返回每列的大小(以字节为单位(?
代码使用指向可变长度数组 (VLA( 的指针,并为rows
行分配足够的内存(将一行的大小sizeof(*array)
乘以行数(。 我假设rows
和cols
都是变量,而不是常量。 (常量名称通常以全部大写形式书写:例如ROWS
和COLS
。
赋值是array
,而不是*array
——它正式是一种初始化,而不是赋值。*
是类型的一部分;这是array
的声明(和定义(。 带有强制括号的表示法是您在 C 中声明或定义指向数组的指针的方式:
int (*array)[cols];
这也是指向大小为cols
的int
数组的指针的合法定义。 然后,您可以为其分配:
array = malloc(rows * sizeof(array[0]));
或:
array = malloc(rows * sizeof(*array));
指针指向数组的第零行,因此您现在可以使用如下代码来访问数据:
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
array[r][c] = rand() % 128;
}