繁体   English   中英

malloc和calloc

[英]malloc and calloc

我知道这个问题可能被标记为malloc和calloc之间的区别重复,但我还是想问一下。

我知道calloc启动了内存块,这里我的问题并不是关注那个部分。

我的问题是

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

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

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

因为我觉得我们可以使用malloc做同样的事情。

例如 :

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

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

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

calloc用ZERO填充内存。

p=calloc(n, m); 

相当于

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

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

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

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

malloc不同, calloc还初始化内存块以包含零。

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

在程序接触malloc()之前,malloc()返回指针不会触及实际内存。 而calloc()则使用RAM返回内存。

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

ptr = malloc(num*size);

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

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

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

===你可以看到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'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM