C-calloc()v。malloc()

C-calloc()v。malloc(),c,malloc,calloc,C,Malloc,Calloc,可能重复: 请解释这一声明的意义 另一个 malloc()和 calloc()函数是指内存 由malloc()函数分配 包含垃圾值,而内存 由calloc()函数分配 包含所有零 来源(“C”编程,Salim Y.Amdani) 感谢calloc正在使用内存之前初始化内存,但malloc没有 请参阅链接: calloc()函数应分配 用于nelem数组的未使用空间 元素,每个元素的大小以字节为单位 是埃尔西。空间应为 已初始化为所有位0 使用malloc,如果要保证相同的效果,必须调用mems

可能重复:

请解释这一声明的意义

另一个 malloc()和 calloc()函数是指内存 由malloc()函数分配 包含垃圾值,而内存 由calloc()函数分配 包含所有零

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


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

请参阅链接:

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

使用
malloc
,如果要保证相同的效果,必须调用memset之类的函数来重置内存,例如

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

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

From


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

这意味着,如果您使用calloc()分配内存,则分配的任何内容都是0。i、 如果你为一个整数数组分配了空间,它们都会被设置为0,而对于malloc(),那里的内存不会以任何方式初始化

您可以在只对内存执行0的memset的情况下使用calloc。

calloc(…)
基本上是
malloc
+
memset
(如果您想0初始化内存)

当您使用
malloc
分配一些内存时,它以前的内容不会被清除(即未初始化)。您可能会得到机器启动时设置的随机值,或者您可能会看到一些内存属于以前运行的程序,但在分配和程序退出后未清除


calloc
本身比
malloc
慢,因为您必须花费一些时间来清除分配内存的内容。因此,如果您只需要分配一些内存,然后在那里复制一些内容,您可以自由地使用
malloc

,这似乎是不言自明的。问题是什么?你不明白垃圾值是什么吗?为什么malloc()不初始化?在我看来,假设初始化内存是一种很好的做法,那么calloc()应该用在malloc()之上。如果您想将该内存用于除全零之外的其他内容,该怎么办?那么你就浪费了将所有内存都设置为0所需的时间。如果你立即将内存初始化为填充,那么就没有理由将内存归零。e、 g.将字符串复制到malloc'ed内存中,使用各种值初始化结构,等等。初始化内存的意义是什么?为什么malloc()不初始化?大多数情况下,只要分配内存,就要自己填充它的内容(例如,为数组中的所有元素或结构中的所有字段赋值)。在这种情况下,您不需要在使用内存之前将其归零,因此使用malloc。如果您特别需要将内存归零,可以使用calloc。这相当于malloc后跟memset,但可能更快,因为分配器可以巧妙地处理它。示例不正确,
sizeof(buffer)
等于
sizeof(char*)
;它不会将整个缓冲区初始化为零。想象一下,如果分配给你一块土地。你不知道土地在哪里,你不知道土地上有什么,你得到的只是一份契据。这就是
malloc
有效的功能-返回指向内存区域的指针。现在,
calloc
可能与
malloc
类似,只是委员会保证首先将所有东西从土地上推走。花费更多的时间,因此更昂贵,但你知道你会得到什么。你选择,不要投malloc@cat,谢谢你;)根据最近的这篇文章,这不是真的。他指出,calloc速度更快,并且还有其他几个好处。我同意,calloc不仅在现代系统上通常更快,有时甚至更快,而且可以避免一些令人尴尬的错误!对于嵌入式内容,YMMV。
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.