繁体   English   中英

解释如何使用这两行来分配和释放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结果的演员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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM