为了账号安全,请及时绑定邮箱和手机立即绑定

malloc和calloc的区别?

malloc和calloc的区别?

C
富国沪深 2019-06-25 11:20:14
malloc和calloc的区别?这样做有什么区别:ptr = (char **) malloc (MAXELEMS * sizeof(char *));或:ptr = (char **) calloc (MAXELEMS, sizeof(char*));什么时候对malloc使用calloc是个好主意,反之亦然?
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

calloc()零初始化缓冲区,同时malloc()内存未初始化。

编辑:

将内存归零可能需要一些时间,所以您可能要使用malloc()如果表演是个问题的话。如果初始化内存更重要,请使用calloc()..例如,calloc()可能会给你留个电话memset().


查看完整回答
反对 回复 2019-06-25
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

一个鲜为人知的区别是,在具有乐观内存分配(如linux)的操作系统中,malloc在程序真正接触到它之前不会有真正的内存支持。

calloc确实会触摸内存(它会在内存上写入零),因此您将确保操作系统使用实际的RAM(或交换)支持分配。这也是为什么它比malloc慢的原因(它不仅必须使其为零,操作系统还必须通过可能交换其他进程来找到合适的内存区域)。

例如见这个问题进一步探讨malloc的行为


查看完整回答
反对 回复 2019-06-25
?
跃然一笑

TA贡献1826条经验 获得超6个赞

一个经常被忽视的优点calloc它将有助于保护您免受整数溢出漏洞的影响。比较:

size_t count = get_int32(file);struct foo *bar = malloc(count * sizeof *bar);

v.V.

size_t count = get_int32(file);struct foo *bar = calloc(count, sizeof *bar);

前者可能导致微小的分配和随后的缓冲区溢出,如果count大于SIZE_MAX/sizeof *bar..在这种情况下,后者将自动失败,因为无法创建大型对象。

当然,您可能需要注意不符合的实现,这就忽略了溢出的可能性.如果这是您所针对的平台上的问题,那么无论如何您都必须对溢出进行手动测试。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 682 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信