请解释此声明的重要性,
另一个 malloc()和。之间的区别 calloc()函数就是内存 由malloc()函数分配 包含垃圾值,而内存 由calloc()函数分配 包含全零。
来源('C'编程,Salim Y. Amdani)
由于
答案 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。