首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >calloc()诉malloc()

calloc()诉malloc()
EN

Stack Overflow用户
提问于 2010-08-10 12:45:43
回答 4查看 73.4K关注 0票数 33

可能重复: malloc与calloc之间的差异

请解释这句话的意义,

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

资料来源(“C”编程,Salim Y.amdani)

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-10 12:51:03

来自内存

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

票数 41
EN

Stack Overflow用户

发布于 2010-08-10 12:49:55

calloc在您使用内存之前正在初始化它,但是malloc没有。

请参阅链接:

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

对于malloc,如果您想保证同样的效果,就必须调用像memset这样的东西来重置内存。

代码语言:javascript
复制
char* buffer = (char*)malloc(100);
memset(buffer,0,100);

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

例如,如果您只是将垃圾留在变量中,并且正在检查某个值(例如42 ),那么您就无法知道程序是否真的将该值设置为42,或者因为您没有初始化它,所以这只是一些垃圾剩余物。

票数 25
EN

Stack Overflow用户

发布于 2010-08-10 13:02:27

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

代码语言:javascript
复制
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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3449031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档