我已经看到了在C99中使用以下表达式分配2D数组的各种建议:
int (*array)[cols] = malloc(rows * sizeof *array);
我想知道三件事:
整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
分配的内存是否完全连续?
是否只需要一次调用free(array)
来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.
davmac.. 8
(1)整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
整个结构(malloc分配的所有内容)都在堆上.
(2)分配的内存是否完全连续?
是的,malloc
分配一个连续的存储区域.
(3)是否只需要一个调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.
对,是真的.至于它的原因,为什么它会是其他任何方式?您使用分配单个存储区域malloc
,并free
用于取消分配先前返回的单个存储区域malloc
.
我怀疑你对声明类型感到困惑,尽管你没有提到它:
int (*array)[cols]
这意味着array
变量变为单个指针(它本身在堆栈上分配)到一个int
带有cols
元素的数组(由于使用而在堆上分配malloc
).将此与更常见的比较:
int *array[cols]
...而是声明一个指针的一维数组(数组本身将在堆栈上).您可以使用后者创建一个指向数组的数组,方法是在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放这些数组!).这种结构可以以类似于2D阵列的方式使用,但实际上并不是一回事.
还要记住,C中的指针始终指向数组.所以,即使第一声明声明一个指针指向一个1维阵列,它可以被用来在点的阵列这样的阵列,即,2维数组作为你想要的.实际上,malloc
调用为这样的数组分配存储:
malloc(rows * sizeof *array);
这里,sizeof *array
是带有cols
元素的(单个)1D数组的大小(以字节为单位).当乘以行数时,它产生尺寸为rows
× 的2D阵列的存储要求cols
.
(1)整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
整个结构(malloc分配的所有内容)都在堆上.
(2)分配的内存是否完全连续?
是的,malloc
分配一个连续的存储区域.
(3)是否只需要一个调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.
对,是真的.至于它的原因,为什么它会是其他任何方式?您使用分配单个存储区域malloc
,并free
用于取消分配先前返回的单个存储区域malloc
.
我怀疑你对声明类型感到困惑,尽管你没有提到它:
int (*array)[cols]
这意味着array
变量变为单个指针(它本身在堆栈上分配)到一个int
带有cols
元素的数组(由于使用而在堆上分配malloc
).将此与更常见的比较:
int *array[cols]
...而是声明一个指针的一维数组(数组本身将在堆栈上).您可以使用后者创建一个指向数组的数组,方法是在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放这些数组!).这种结构可以以类似于2D阵列的方式使用,但实际上并不是一回事.
还要记住,C中的指针始终指向数组.所以,即使第一声明声明一个指针指向一个1维阵列,它可以被用来在点的阵列这样的阵列,即,2维数组作为你想要的.实际上,malloc
调用为这样的数组分配存储:
malloc(rows * sizeof *array);
这里,sizeof *array
是带有cols
元素的(单个)1D数组的大小(以字节为单位).当乘以行数时,它产生尺寸为rows
× 的2D阵列的存储要求cols
.