仅用以下两行解释如何在 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。您将整个二维数组分配为连续的内存块。

延伸阅读:.