C - calloc()v.malloc()

时间:2010-08-10 12:45:43

标签: c malloc calloc

  

可能重复:
  c difference between malloc and calloc

请解释此声明的重要性,

  

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

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

由于

4 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:24)

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

请参阅this链接:

  

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

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

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

calloc为您节省了额外的一步。 初始化内存的意义在于,您将变量变为已知状态而非未知状态。因此,如果要检查变量(例如数组元素)的预期值,那么通过提前预先初始化变量,可以确保要检查的值不是垃圾。 换句话说,您可以区分垃圾和合法值。

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

答案 2 :(得分:8)

calloc(...)基本上是malloc + memset(如果你想初始化内存)

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 :(得分:3)

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

你可以在你打算对内存进行0的memset的情况下使用calloc。