calloc 为您节省了额外的一步 . 初始化内存的意义在于,您将变量变为已知状态而非未知状态 . 因此,如果要检查变量(例如数组元素)的预期值,那么通过提前预先初始化变量,可以确保要检查的值不是垃圾 . In other words, you can distinguish between garbage and legitimate values.
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.
4 回答
来自http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory
malloc()
更快,因为calloc()
初始化分配的内存以包含全零 . 由于您通常希望自己使用和初始化内存,因此可能没有必要使用calloc()
的额外好处 .calloc
在使用之前初始化内存,但malloc
没有 .请参阅this链接:
使用
malloc
,如果你想保证相同的效果,你必须调用类似memset的东西来重置内存,例如calloc
为您节省了额外的一步 . 初始化内存的意义在于,您将变量变为已知状态而非未知状态 . 因此,如果要检查变量(例如数组元素)的预期值,那么通过提前预先初始化变量,可以确保要检查的值不是垃圾 . In other words, you can distinguish between garbage and legitimate values.例如,如果你只是在变量中留下垃圾而你正在检查一些值,比如说42,那么你无法知道你的程序是否真的将值设置为42,或者这只是因为你只剩下一些垃圾了没有初始化它 .
calloc(...)
基本上是malloc
memset
(如果要初始化内存为0)当您使用
malloc
分配一些内存时,它的先前内容不会被清除(即未初始化) . 您可能会获得在计算机启动时设置的随机值,或者您可能会看到某些内存属于以前运行的程序,但在分配和程序退出后仍未清除 .calloc
本身比malloc
慢,因为你必须花一些时间来清除已分配内存的内容 . 因此,如果您只需要分配一些内存然后在那里复制一些内容,则可以自由使用malloc
.它只是意味着如果你用calloc()分配内存,你分配的任何东西都是0.即如果你为一个整数数组分配空间,它们都被设置为0,而使用malloc()时,内存就没有了不以任何方式初始化 .
无论如何,你可以在你要对存储器进行0的memset的情况下使用calloc .