【问题标题】:Is this is correct about malloc() and calloc()?malloc() 和 calloc() 是否正确?
【发布时间】:2018-05-28 21:58:30
【问题描述】:

我已经尽我所能研究了所有可能的方式,但我很难消化两个 malloc 的事实,即malloc(sizeof(10)) 和 calloc 即 calloc(2,sizeof(5)) 分配相同的连续内存,忽略 calloc 初始化为零并且工作相对比 malloc 慢的其他事实。所以这就是我的想法。

我认为在 32 位系统上,如果我们调用 malloc 并说 malloc(sizeof(10)),那么 malloc 将进入堆并分配 12 字节的内存,因为对于 32 位系统,内存包是按组排列的4 个字节,因此要分配 10 个字节,需要 3 个块,最后一个块中填充 2 个字节。

类似地,如果我们调用 calloc 并说calloc(2,sizeof(5)),那么它将分配 2 个块,每个块大小为 8 个字节,总共 16 个字节,因为出于同样的原因,内存在 4 个字节的包中并分配 5 个字节使用了两个 4 字节的块,在一个块中将提供 3 个字节的填充。

这就是我对 malloc 和 calloc 的看法。我可能对或错,但请告诉我任何一种方式。

【问题讨论】:

  • malloc(sizeof(10)) 和 calloc 即 calloc(2,sizeof(5)) 分配相同的传染性内存 - 这完全是错误的。也许你的意思是malloc(10)calloc(2,5)
  • 这些函数的确切行为由实现定义。它可以做你所说的,或者完全不同的事情。从 C 开发人员的角度来看,这并不重要。
  • @EugeneSh。没错。
  • "calloc initializes to zero and works relatively slower" - “相对较慢” 可以忽略不计,在分配数组等的几乎所有情况下,防止从未初始化的无意读取的好处由于所有字节初始化为零,value far out 对分配速度的任何相对差异进行加权。
  • C 库接口按照文档说明的方式工作。您的愿望、信念和审美判断不会改变行为。

标签: c pointers memory memory-management dynamic-memory-allocation


【解决方案1】:

当你使用这两种方法时,你得到的是至少你请求的内存量。它可以更多。一个原因可能是你提到的那个。另一个原因可能是你得到一个更大的块,以防你以后想改变它。

没有办法确切地说你得到了多少。只是保证你至少满足你的要求,如果你不这样做,你会得到一个空指针。

请注意,get 我的意思是你得到你想要的,你永远不能指望更多。那将是未定义的行为。

【讨论】:

  • 不,不是。你所说的可能听起来很合理,可能有也可能没有,但你根本没有任何保证。您只能指望您要求的金额。
  • 这个答案是错误的。你得到的正是你所要求的。可能碰巧是,由于实现细节,与您的分配相邻有额外的未使用空间,如果您写入它,碰巧不会破坏其他任何东西,但它不是您分配的一部分,并访问它会调用未定义的行为。这种区别可能是明显的,尤其是使用强化编译器选项(如 GCC 或 LLVM 的消毒剂)时,访问它可能会陷入困境。
【解决方案2】:

calloc 为每个 size 字节的 nmemb 元素的数组分配内存”(Linux man page),但我们知道 arrays in C cannot have padding 在数组元素之间,它们在内存中必须是连续的。另一方面,malloc 分配“size 个字节”,所以malloc(10)calloc(2,5) 中的任何一个都会给你这十个字节。

现在,幕后发生的事情是另一个问题,C 库可能决定分配 12、16 或 42 字节。但是你不能也不能指望这一点。如果你要求 10 个字节,假设你得到了 10 个。

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2013-11-17
    • 2020-03-22
    • 2010-12-05
    • 2014-10-04
    • 2020-04-08
    • 2013-06-06
    • 2011-07-03
    相关资源
    最近更新 更多