[英]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.