calloc()与malloc()
可能重复:
malloc和calloc之间的区别
请解释这个声明的意义,
malloc()和calloc()函数之间的另一个区别是,由malloc()函数分配的内存包含垃圾值,而由calloc()函数分配的内存包含全零。
来源('C'编程,Salim Y. Amdani)
谢谢
从http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory
malloc()
更快,因为calloc()
初始化分配的内存以包含所有的零。 既然你通常会想自己使用和初始化内存,那么calloc()
这个额外好处可能就没有必要了。
calloc
在使用它之前正在初始化内存,但malloc
不会。
请参阅此链接:
calloc()函数应该为每个字节大小为elsize的nelem元素分配一个未使用的空间。 该空间应初始化为全0位。
使用malloc
,如果你想保证相同的效果,你必须调用memset来重置内存,例如
char* buffer = (char*)malloc(100);
memset(buffer,0,100);
calloc
您节省了额外的一步。 初始化内存的重要性在于你正在获取一个已知状态的变量,而不是一个未知的状态。 因此,如果你正在检查一个变量,比如一个数组元素,对于一个期望的值,那么通过提前预先初始化变量,你可以确定你正在检查的值不是垃圾。 换句话说,您可以区分垃圾和合法值。
例如,如果你只是把垃圾留在变量中,而你正在检查某个值,比如说42,那么你无法知道你的程序的值是否真的被设置为42,或者如果这只是一些垃圾,因为你没有初始化它。
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
。
上一篇: calloc() v. malloc()
下一篇: Does malloc lazily create the backing pages for an allocation on Linux (and other platforms)?