[英]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
结果的演员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]
。
一个免费就足够了,因为只有一个malloc。 您将整个2D阵列分配为连续的内存块。
进一步阅读: 正确分配多维数组 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.