我知道这个问题可能会被标记为malloc和calloc之间的差异的副本,但我仍然想问它。
我知道calloc初始化了内存块,这里我的问题不是集中在这一部分。
我的问题是
malloc的定义说明它分配指定大小的内存块。
calloc说它分配了多个内存块,每个内存块的大小都相同。
一个内存块和多个内存块的这种分配是两者之间的真正区别吗?
因为我觉得我们可以使用malloc来做同样的事情,这可以通过calloc来完成。
例如:
int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));和
int *ptr;
ptr=(int *) calloc(100,sizeof(int));最终分配的内存是int所需内存的100倍。
发布于 2012-02-09 23:07:35
您的代码示例是正确的……ptr指向的实际内存将是相同的大小(即,100个int对象堆上的数组)。正如其他人所提到的,对calloc的调用实际上会将该内存清零,因为malloc只会给你一个指向该内存的指针,而该内存中可能有也可能没有全零。例如,如果您获得的内存是从另一个对象回收的,那么对malloc的调用仍将具有上次使用的值。因此,如果您将内存视为“干净的”内存,并且不使用某些默认值对其进行初始化,那么您的程序将会出现某种类型的意外行为。
发布于 2012-02-09 23:01:27
calloc用零填充内存。
p=calloc(n, m); 等同于
p=malloc(n*m);
memset(p, 0, m * n);因此,如果您打算将分配的内存设置为零,那么使用malloc必须计算两次n*m,或者使用一个temp变量,这就是calloc所做的。
编辑:我刚刚阅读了ISO标准,发现没有指定calloc的实现应该检查n*m是否溢出,也就是说,它是否超过了C99标准中的常量SIZE_MAX。
发布于 2012-02-09 23:20:44
是的,主要的区别就是上面提到的。而且,从操作系统内存分配的角度来看,calloc()比malloc()慢。
在程序接触到malloc()之前,malloc()返回的指针不会接触到实际内存。而calloc() back是带有RAM的内存。
https://stackoverflow.com/questions/9213144
复制相似问题