33

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

请解释这句话的意义,

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

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

谢谢

4

4 回答 4

41

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

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

于 2010-08-10T12:51:03.907 回答
25

calloc正在初始化内存,然后再使用它,但malloc没有。

参考这个链接:

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

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

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

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

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

于 2010-08-10T12:49:55.340 回答
9

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.

于 2010-08-10T13:02:27.730 回答
4

它只是意味着如果你使用 calloc() 分配内存,无论你分配什么都是 0。也就是说,如果你为整数数组分配空间,它们都将设置为 0,而使用 malloc(),内存没有'没有以任何方式初始化。

您可以在无论如何都要对内存执行 0 的 memset 的情况下使用 calloc。

于 2010-08-10T12:52:53.590 回答