C语言 C99 - 二维阵列分配的概念理解



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

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

以下是我目前对它的理解:

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

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

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

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

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

int (*array)[cols];

这也是指向大小为colsint数组的指针的合法定义。 然后,您可以为其分配:

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

最新更新