首页 文章

C - calloc()v.malloc()[复制]

提问于
浏览
31

可能重复:c malloc和calloc之间的区别

请解释一下这句话的意义,

malloc()和calloc()函数之间的另一个区别是malloc()函数分配的内存包含垃圾值,而calloc()函数分配的内存包含全零 .

来源('C'编程,Salim Y. Amdani)

谢谢

4 回答

  • 24

    来自http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

    malloc() 更快,因为 calloc() 初始化分配的内存以包含全零 . 由于您通常希望自己使用和初始化内存,因此可能没有必要使用 calloc() 的额外好处 .

  • 40

    calloc 在使用之前初始化内存,但 malloc 没有 .

    请参阅this链接:

    calloc()函数应为nelem元素数组分配未使用的空间,每个元素的大小(以字节为单位)为elsize . 该空间应初始化为所有位0 .

    使用 malloc ,如果你想保证相同的效果,你必须调用类似memset的东西来重置内存,例如

    char* buffer = (char*)malloc(100);
    memset(buffer,0,100);
    

    calloc 为您节省了额外的一步 . 初始化内存的意义在于,您将变量变为已知状态而非未知状态 . 因此,如果要检查变量(例如数组元素)的预期值,那么通过提前预先初始化变量,可以确保要检查的值不是垃圾 . In other words, you can distinguish between garbage and legitimate values.

    例如,如果你只是在变量中留下垃圾而你正在检查一些值,比如说42,那么你无法知道你的程序是否真的将值设置为42,或者这只是因为你只剩下一些垃圾了没有初始化它 .

  • 8

    calloc(...) 基本上是 malloc memset (如果要初始化内存为0)

    ptr = malloc(sizeof(struct fubar));
    memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.
    

    当您使用 malloc 分配一些内存时,它的先前内容不会被清除(即未初始化) . 您可能会获得在计算机启动时设置的随机值,或者您可能会看到某些内存属于以前运行的程序,但在分配和程序退出后仍未清除 .

    calloc 本身比 malloc 慢,因为你必须花一些时间来清除已分配内存的内容 . 因此,如果您只需要分配一些内存然后在那里复制一些内容,则可以自由使用 malloc .

  • 3

    它只是意味着如果你用calloc()分配内存,你分配的任何东西都是0.即如果你为一个整数数组分配空间,它们都被设置为0,而使用malloc()时,内存就没有了不以任何方式初始化 .

    无论如何,你可以在你要对存储器进行0的memset的情况下使用calloc .

相关问题