int (*mapTerrain)[10] = (int (*)[10])malloc(sizeof(int[10][10]));
free(mapTerrain);
此站点上有人建议使用这两行代码在 C 中处理动态二维数组。尺寸为 [10][10]
。问题是,我不确定我是否正确理解了它们。如果我必须解释这两行,我会说以下内容:
在左侧,我们有一个大小为 10 的 int
指针数组。(无法解释转换,我自己希望它是 int *
)。
传递给 malloc
的是 int
大小为 [10][10]
的数组。 (为什么不是...malloc(sizeof(int*10*10));
?)是什么让我们可以将数组传递给 malloc
而不是 size_t 尺寸
?
至于 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
表示通过指针“给我数组编号 i
”算术。
这个技巧与我们做类似的事情本质上是一样的
char* ptp = malloc(sizeof("hello"));`
这里我们也不指向整个数组,我们指向它的第一个元素。
sizeof(int[10][10])
100% 等同于 sizeof(int*10*10)
(或 400
就此而言),但第一个是自记录代码,表明我们希望将分配的数据用作数组 int[10][10]
。
一个 free 就足够了,因为只有一个 malloc。您将整个二维数组分配为连续的内存块。
关于c - 解释如何仅使用这两行 : 在 C 中为二维数组分配和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619779/