c - 解释如何仅使用这两行 : 在 C 中为二维数组分配和释放内存

标签 c arrays multidimensional-array dynamic-memory-allocation

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。您将整个二维数组分配为连续的内存块。

进一步阅读:Correctly allocating multi-dimensional arrays .

关于c - 解释如何仅使用这两行 : 在 C 中为二维数组分配和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619779/

相关文章:

Java 8 : Reverse an int array in one line (using Streams API)

ios - 如何在 UIPicker 中首先选择具有特定标题的数组

php - 将两个或多个简单数组转换为多维数组?

c - 有什么办法可以用我自己的 softirq 调用 linux 内核

javascript - 按字母顺序对关联数组/javascript 对象进行排序

C# 数组子集获取

python - 这里发生了什么?在随机列表列表中重复行

c - 将 C 中的递归函数转换为迭代函数

c - GetMessage() 挂断

c++ - 如何从静态 C 和 C++ 库创建共享 C 库?