2

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

我知道 calloc 初始化内存块,这里我的问题不在于那部分。

我的问题是

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

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

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

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

例如 :

int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));

int *ptr;
ptr=(int *) calloc(100,sizeof(int));

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

4

7 回答 7

7

calloc用零填充内存。

p=calloc(n, m); 

相当于

p=malloc(n*m); 
memset(p, 0, m * n);

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

编辑:我刚刚阅读了 ISO C 标准,发现没有指定执行是否calloc应检查是否n*m溢出,即是否超过SIZE_MAXC99 标准中的常量。

于 2012-02-09T15:01:27.320 回答
6

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

于 2012-02-09T15:07:35.270 回答
4

是的,主要区别如上所述。从操作系统内存分配的角度来看, calloc() 也比 malloc() 慢。

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

于 2012-02-09T15:20:43.767 回答
3

这个网站之前已经提到过,但从其他答案来看,我认为值得重复;将两个整数相乘可能会导致溢出,如果发生这种情况,

ptr = malloc(num*size);

可能不会得到想要的结果(并且很可能导致以后的分段错误)。对于这些情况,calloc(num,size)应该首选(尽管您也可以在调用 malloc 之前测试溢出,如果将calloc()新分配的内存初始化为零的事实困扰您)。

于 2012-02-09T15:35:07.203 回答
3

Wellcalloc还将内存块初始化为包含零,这与malloc.

于 2012-02-09T14:59:47.973 回答
0

两者的主要区别是 calloc 将内存块初始化为零,而 malloc 创建的内存块包含垃圾值。

因此更适合使用 calloc 而不是 malloc 以避免代码中的不确定性。

于 2015-08-08T03:55:57.373 回答
0

===你可以看到mallac()calloc()函数的以下区别===

初始化:
malloc() 不会清除和初始化分配的内存。
calloc() 将分配的内存初始化为零。

语法:

void *malloc(size_t size);                   // syntex for malloc() function
void *calloc(size_t num, size_t size);       // syntex for calloc() function

// example
ptr = malloc(num*size);   // for malloc() function
ptr = calloc(num,size);   // for calloc() function

参数:
如果你考虑 malloc() 语法,它只需要 1 个参数。
如果您考虑 calloc() 语法,它将采用 2 个参数。

内存分配方式::
malloc() 函数从可用堆中分配所需“大小”的内存。
calloc() 函数分配的内存大小等于“num *size”。

于 2019-06-23T06:01:02.283 回答