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

malloc和calloc
EN

Stack Overflow用户
提问于 2012-02-09 22:57:13
回答 7查看 2.4K关注 0票数 2

我知道这个问题可能会被标记为malloc和calloc之间的差异的副本,但我仍然想问它。

我知道calloc初始化了内存块,这里我的问题不是集中在这一部分。

我的问题是

malloc的定义说明它分配指定大小的内存块。

calloc说它分配了多个内存块,每个内存块的大小都相同。

一个内存块和多个内存块的这种分配是两者之间的真正区别吗?

因为我觉得我们可以使用malloc来做同样的事情,这可以通过calloc来完成。

例如:

代码语言:javascript
复制
int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));

代码语言:javascript
复制
int *ptr;
ptr=(int *) calloc(100,sizeof(int));

最终分配的内存是int所需内存的100倍。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-09 23:07:35

您的代码示例是正确的……ptr指向的实际内存将是相同的大小(即,100个int对象堆上的数组)。正如其他人所提到的,对calloc的调用实际上会将该内存清零,因为malloc只会给你一个指向该内存的指针,而该内存中可能有也可能没有全零。例如,如果您获得的内存是从另一个对象回收的,那么对malloc的调用仍将具有上次使用的值。因此,如果您将内存视为“干净的”内存,并且不使用某些默认值对其进行初始化,那么您的程序将会出现某种类型的意外行为。

票数 6
EN

Stack Overflow用户

发布于 2012-02-09 23:01:27

calloc用零填充内存。

代码语言:javascript
复制
p=calloc(n, m); 

等同于

代码语言:javascript
复制
p=malloc(n*m); 
memset(p, 0, m * n);

因此,如果您打算将分配的内存设置为零,那么使用malloc必须计算两次n*m,或者使用一个temp变量,这就是calloc所做的。

编辑:我刚刚阅读了ISO标准,发现没有指定calloc的实现应该检查n*m是否溢出,也就是说,它是否超过了C99标准中的常量SIZE_MAX

票数 7
EN

Stack Overflow用户

发布于 2012-02-09 23:20:44

是的,主要的区别就是上面提到的。而且,从操作系统内存分配的角度来看,calloc()比malloc()慢。

在程序接触到malloc()之前,malloc()返回的指针不会接触到实际内存。而calloc() back是带有RAM的内存。

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

https://stackoverflow.com/questions/9213144

复制
相关文章

相似问题

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