【问题标题】:What's the difference between calloc & malloc followed by a memset? [duplicate]calloc 和 malloc 后跟 memset 有什么区别? [复制]
【发布时间】:2012-05-28 14:43:21
【问题描述】:

可能重复:
c difference between malloc and calloc
why malloc+memset slower than calloc?

calloc 和 malloc 后跟 memset 有什么区别?如果我用 malloc 后跟 memset 替换所有对 calloc 的调用,会一样吗?

如果是这样,那为什么要分别提供两个函数 malloc 和 calloc 呢?

【问题讨论】:

标签: c malloc calloc


【解决方案1】:

虽然 calloc() 总是用零初始化内存区域 ('\0'),但 memset() 调用允许您选择用哪些字节填充内存。

在速度方面,如果内存需要清零,calloc() 可能会比malloc() + memset() 快; malloc() 更快地返回未初始化的内存,但它仍然需要额外调用 memset()

基本上,如果您想将内存归零,请使用calloc();如果您想保持未初始化,请使用malloc()

【讨论】:

  • 你绝对是 r8 :)
【解决方案2】:

一个重要的区别是,如果nmemb * size 溢出,我希望calloc(nmemb, size) 返回NULL。如果您改为使用malloc(nmemb * size),则乘法溢出可能会导致您请求的缓冲区比您预期的要小(这可能会导致以后出现安全问题)。因此,如果您打算将 calloc 调用替换为 malloc 调用,则需要小心。

【讨论】:

  • “使用 malloc,你最终会请求比预期更小的缓冲区” - 这怎么可能?如果 malloc 不能提供请求的字节数,它会不会失败?如果您能更详细地澄清它,那就太好了。
  • @Jay:是的,如果malloc 不能提供请求的字节数,它将失败。这里的问题是,如果您不检查乘法溢出,request 本身可能是错误的。
  • @jamesdlin 这不在标准中,所以我希望你自己做边界检查;-)
  • @Jack 标准中可能没有明确说明,但我认为如果它不能满足请求,calloc 返回NULL 的要求是隐含的。不过,我确实承认可能存在实施质量问题。
猜你喜欢
  • 2017-09-08
  • 2013-11-17
  • 2013-03-06
  • 2010-12-05
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多