有没有理由不使用calloc而不是malloc?

Vio*_*ffe 11 c c++ malloc calloc dynamic-allocation

calloc()几天我刚刚了解了C 功能.看了它的描述和它有什么不同malloc(1,2),我的想法是,作为非嵌入式程序员,我应该总是使用calloc().但情况确实如此吗?

我有一个保留是访问calloc()-ed内存的额外延迟,但我也想知道是否有时候切换malloc()calloc()将以更严重的方式破坏程序.

PS零初始化方面calloc()对我来说非常清楚.我有兴趣了解的是calloc()malloc()- 懒惰内存分配之间的另一个区别calloc().如果您要专注于内存初始化方面,请不要发布答案.

Sou*_*osh 7

这实际上是一种依赖于情境的决定.经验法则是

  • 如果你是第一次写入分配的内存,malloc()则更好(开销更少).

    示例:请考虑以下方案

    char * pointer = NULL;
    
    //allocation
    
    strcpy(pointer, source);
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,分配可以很好地使用malloc().

  • 如果有可能使用分配的内存进行先读后读,请在calloc()初始化内存时使用.这样就可以避免单元化内存read-before-write场景调用未定义行为的问题.

    例:

    char * pointer = NULL;
    
    //allocation
    
    strcat(pointer, source);
    
    Run Code Online (Sandbox Code Playgroud)

    这里,strcat()需要第一个参数已经是一个字符串,并且使用malloc()分配不能保证.由于calloc()零初始化内存,它将在此处起作用,因此,calloc()是这种情况的方法.

详细说明第二种情况,引用C11第7.24.3.1章(按照我的意见)

strcat()函数将指向的字符串的副本s2(包括终止空字符)附加到指向的字符串的末尾s1.最初的字符s2覆盖了结尾处的空字符s1.[....]

因此,在这种情况下,目标指针应该是指向字符串的指针.通过calloc()保证分配使用malloc()不能保证,正如我们所知,从章节§7.22.3.4

malloc函数为大小由其指定size其值不确定的对象分配空间.


编辑:

malloc()建议的一个可能方案calloc()是编写用于单元/集成测试的测试存根.在这种情况下,使用calloc()可以隐藏潜在的错误,这些错误通过类似于后者的情况到达.


Pau*_*ans 1

这完全取决于你想用内存做什么。malloc返回未初始化的(甚至可能还不是真实的)内存。 calloc返回真实的、归零的内存。如果您需要将其归零,那么是的,calloc是您的最佳选择。如果您不这样做,为什么当您不需要时却要为延迟为零而付出代价呢?