仅用以下两行解释如何在 C 中为二维数组分配和释放内存:
Explain how it's possible to allocate and free memory for a 2d array in C with just these 2 lines:
int (*mapTerrain)[10] = (int (*)[10])malloc(sizeof(int[10][10]));
free(mapTerrain);
此站点上有人建议使用这两行代码来处理 C 中的动态二维数组。尺寸为 [10][10]
。问题是,我不确定我是否正确理解了它们。如果我必须解释这两行,我会说以下内容:
左边我们有一个大小为 10 的 int
指针数组。(无法解释转换,我自己希望它是 int *
)。
传递给 malloc
的是 int
-s 大小的数组 [10][10]
。 (为什么不是...malloc(sizeof(int*10*10));
?)是什么让我们可以将数组传递给 malloc
而不是 size_t size
?
至于 free(mapTerrain);
行。怎么一个free
就够了?根据我的记忆,你必须为动态二维数组的每一行调用 free
。
malloc
结果的转换只是混乱,没有必要。
最正确的正式版本是:
int (*mapTerrain)[10][10] = malloc(sizeof(int[10][10]));
这是指向 int [10][10]
数组的数组指针。然而,这样的指针在实践中使用起来有点痛苦,因为要获得我们必须做的项目:
*mapTerrain
从数组指针获取指向的数组
(*mapTerrain)
括号不会超过运算符的优先级。
(*mapTerrain)[i][j]
获得单个物品。
作为一个技巧,我们可以使用指向 int[10][10]
的第一个元素的指针。第一个元素的类型为 int[10]
,因此指向该元素的数组指针为 int(*)[10]
。有了这个类型,我们就可以像预期的那样做mapTerrain[i][j]
,因为i
通过指针运算表示"give me array number i
"。
这个技巧与我们做类似的事情本质上是一样的
char* ptp = malloc(sizeof("hello"));`
这里我们也不指向整个数组,我们指向它的第一个元素。
sizeof(int[10][10])
100% 等同于 sizeof(int*10*10)
(或 400
),但第一个是自文档代码,表明我们期望使用分配的数据作为数组 int[10][10]
.
一个free就够了,因为只有一个malloc。您将整个二维数组分配为连续的内存块。
延伸阅读:.
int (*mapTerrain)[10] = (int (*)[10])malloc(sizeof(int[10][10]));
free(mapTerrain);
此站点上有人建议使用这两行代码来处理 C 中的动态二维数组。尺寸为 [10][10]
。问题是,我不确定我是否正确理解了它们。如果我必须解释这两行,我会说以下内容:
左边我们有一个大小为 10 的 int
指针数组。(无法解释转换,我自己希望它是 int *
)。
传递给 malloc
的是 int
-s 大小的数组 [10][10]
。 (为什么不是...malloc(sizeof(int*10*10));
?)是什么让我们可以将数组传递给 malloc
而不是 size_t size
?
至于 free(mapTerrain);
行。怎么一个free
就够了?根据我的记忆,你必须为动态二维数组的每一行调用 free
。
malloc
结果的转换只是混乱,没有必要。
最正确的正式版本是:
int (*mapTerrain)[10][10] = malloc(sizeof(int[10][10]));
这是指向 int [10][10]
数组的数组指针。然而,这样的指针在实践中使用起来有点痛苦,因为要获得我们必须做的项目:
*mapTerrain
从数组指针获取指向的数组(*mapTerrain)
括号不会超过运算符的优先级。(*mapTerrain)[i][j]
获得单个物品。
作为一个技巧,我们可以使用指向 int[10][10]
的第一个元素的指针。第一个元素的类型为 int[10]
,因此指向该元素的数组指针为 int(*)[10]
。有了这个类型,我们就可以像预期的那样做mapTerrain[i][j]
,因为i
通过指针运算表示"give me array number i
"。
这个技巧与我们做类似的事情本质上是一样的
char* ptp = malloc(sizeof("hello"));`
这里我们也不指向整个数组,我们指向它的第一个元素。
sizeof(int[10][10])
100% 等同于 sizeof(int*10*10)
(或 400
),但第一个是自文档代码,表明我们期望使用分配的数据作为数组 int[10][10]
.
一个free就够了,因为只有一个malloc。您将整个二维数组分配为连续的内存块。
延伸阅读: