【问题标题】:Understanding malloc了解 malloc
【发布时间】:2014-03-14 06:47:18
【问题描述】:

我在实验室得到了这段示例代码,我正在努力理解它

int size = 5;
int **ppi2 = (int **) malloc(size * sizeof(int *));

这是我目前的细分:

为了分配足够的内存,我们必须将要为其分配内存的事物的数量 (size) 乘以这些事物的大小 (sizeof(int *))。这很简单,也很有意义。

我知道我们必须将 malloc 的结果转换为双指针,因为 malloc 返回字节并且变量是双指针,但是为什么我们首先将 ppi2 设置为等于 malloc 的结果?它是否使 ppi2 指向我们刚刚分配的内存中的位置?

【问题讨论】:

  • 我正在用纯 C 语言编程,所以我想我应该转换它
  • 您需要将结果转换为C++,而不是C。只需阅读提供的链接中接受的答案即可。
  • 我做了,我看错了,把它换了。
  • 上面写成int **ppi2 = malloc(size * sizeof *ppi2);更好(而size应该被称为count)。

标签: c pointers malloc


【解决方案1】:

使用malloc,您将要分配的内存字节数作为参数传递,并将地址返回到您刚刚分配的内存的开头。将该地址存储在指针中,然后您可以使用它执行您必须执行的操作。它不返回内存字节,而是返回地址,这样您就可以去操作它们。这就是为什么掌握 C 内存管理很重要的原因(您不知何故丢失了该地址,您“丢失”了内存)。

如果您想更好地了解malloc 如何与内存一起工作以及它与您的程序的关系(我推荐这是因为它的基础知识),请阅读Three Easy Pieces 操作系统书籍中的Chapter 13。很短,很棒。

【讨论】:

    【解决方案2】:

    我知道我们必须将 malloc 的结果转换为双指针,因为 malloc 返回字节并且变量是双指针...

    Do not cast the return value of malloc

    为什么我们首先设置 ppi2 等于 malloc 的结果?

    指向与malloc 返回的指针相同的位置。

    它是否使 ppi2 指向我们刚刚分配的内存位置?

    是的。

    【讨论】:

      【解决方案3】:

      我知道我们必须将 malloc 的结果转换为双指针,因为 malloc 返回字节并且变量是双指针,

      malloc 不返回字节;它返回一个指向它分配的字节的指针。这个指针有一个通用指针类型void *。在 C++ 中,您必须将此 void * 转换回变量的指针类型,但在纯 C 中,此转换是可选的。

      但是为什么我们首先将 ppi2 设置为等于 malloc 的结果呢?它是否使 ppi2 指向我们刚刚分配的内存位置?

      是的。

      【讨论】:

      • 在 C++ 中,通常最好使用 new 而不是 malloc -- 或者,最好使用标准容器类之一。
      • @KeithThompson 可怜可怜的 allocators,没有人永远记得他们:D。分配/释放内存的“真正的”C++ 方式。
      猜你喜欢
      • 2016-12-03
      • 2020-12-15
      • 2012-01-17
      • 2013-06-07
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多