`pixel (*copy)[rows] = malloc(cols * sizeof (*copy))` 需要调用多少次 free()
How many calls to free() are needed for `pixel (*copy)[rows] = malloc(cols * sizeof (*copy))`
我看到过各种关于在 C99 中使用如下表达式分配二维数组的建议:
int (*array)[cols] = malloc(rows * sizeof *array);
我想知道三件事:
是否整个结构都分配在堆上?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
分配的内存是否完全连续?
真的只需要一次调用free(array)
就可以释放整个二维结构吗?我在某个地方读到这个 - 不记得在哪里 - 它似乎对我有用,但我想知道为什么。
(1) Is the entire structure allocated on the heap? Or is this actually a bunch of pointers (on the stack) pointing to arrays on the heap..?
整个结构(malloc 分配的所有内容)都在堆上。
(2) Is the allocated memory completely contiguous?
是的,malloc
分配了一个连续的存储区域。
(3) Is it true that only one call, free(array), is needed to free the whole 2D structure? I read this somewhere - can't remember where - and it seems to work for me, but I'd like to understand why.
是的,这是真的。至于它的为什么,为什么会是别的样子呢?您使用 malloc
分配单个存储区域,free
用于 de-allocate 先前 malloc
.
返回的单个存储区域
我怀疑您对声明类型感到困惑,尽管您没有提及它:
int (*array)[cols]
这意味着 array
变量变成了一个指向 array-of-int
和 cols
元素(其中由于使用 malloc
) 而分配在堆上。将此与更常见的进行比较:
int *array[cols]
... 而是声明一个一维指针数组(数组本身将在堆栈中)。您可以使用后者创建一个 array-of-pointers-to-arrays,通过在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放的数组!)。这种结构可以用类似于二维数组的方式使用,但实际上并不是一回事。
还请记住,C 中的指针始终可以指向数组。因此,即使第一个声明声明了一个指向一维数组的指针,它也可以用于指向 数组 这样的数组,即你想要的二维数组。事实上,malloc
调用为这样的数组分配了存储空间:
malloc(rows * sizeof *array);
此处,sizeof *array
是具有 cols
个元素的(单个)一维数组的字节大小。当乘以行数时,它产生大小为 rows
× cols
.
的二维数组的存储要求
C 不做隐藏内存分配。问题中的类型可以用作真正的二维数组。其实是一个"pointer to array[cols
] of int
".
OTOH,类似于 int *array[cols]
(注意缺少的括号)不是二维数组,而是 "array of pointers to int
"。然而,即使在这里,您也必须 malloc
数组和每一行明确!
并且对于每个 malloc
你需要一个对应的 free
.
请注意,C 标准不需要堆、栈或任何其他特定的管理结构。这留给实施。但是,大多数托管环境(即 full-sized run-time)使用类似堆的东西。
记得检查malloc
的结果并适当处理分配失败。
我看到过各种关于在 C99 中使用如下表达式分配二维数组的建议:
int (*array)[cols] = malloc(rows * sizeof *array);
我想知道三件事:
是否整个结构都分配在堆上?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?
分配的内存是否完全连续?
真的只需要一次调用
free(array)
就可以释放整个二维结构吗?我在某个地方读到这个 - 不记得在哪里 - 它似乎对我有用,但我想知道为什么。
(1) Is the entire structure allocated on the heap? Or is this actually a bunch of pointers (on the stack) pointing to arrays on the heap..?
整个结构(malloc 分配的所有内容)都在堆上。
(2) Is the allocated memory completely contiguous?
是的,malloc
分配了一个连续的存储区域。
(3) Is it true that only one call, free(array), is needed to free the whole 2D structure? I read this somewhere - can't remember where - and it seems to work for me, but I'd like to understand why.
是的,这是真的。至于它的为什么,为什么会是别的样子呢?您使用 malloc
分配单个存储区域,free
用于 de-allocate 先前 malloc
.
我怀疑您对声明类型感到困惑,尽管您没有提及它:
int (*array)[cols]
这意味着 array
变量变成了一个指向 array-of-int
和 cols
元素(其中由于使用 malloc
) 而分配在堆上。将此与更常见的进行比较:
int *array[cols]
... 而是声明一个一维指针数组(数组本身将在堆栈中)。您可以使用后者创建一个 array-of-pointers-to-arrays,通过在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放的数组!)。这种结构可以用类似于二维数组的方式使用,但实际上并不是一回事。
还请记住,C 中的指针始终可以指向数组。因此,即使第一个声明声明了一个指向一维数组的指针,它也可以用于指向 数组 这样的数组,即你想要的二维数组。事实上,malloc
调用为这样的数组分配了存储空间:
malloc(rows * sizeof *array);
此处,sizeof *array
是具有 cols
个元素的(单个)一维数组的字节大小。当乘以行数时,它产生大小为 rows
× cols
.
C 不做隐藏内存分配。问题中的类型可以用作真正的二维数组。其实是一个"pointer to array[cols
] of int
".
OTOH,类似于 int *array[cols]
(注意缺少的括号)不是二维数组,而是 "array of pointers to int
"。然而,即使在这里,您也必须 malloc
数组和每一行明确!
并且对于每个 malloc
你需要一个对应的 free
.
请注意,C 标准不需要堆、栈或任何其他特定的管理结构。这留给实施。但是,大多数托管环境(即 full-sized run-time)使用类似堆的东西。
记得检查malloc
的结果并适当处理分配失败。