malloc和calloc
我知道这个问题可能被标记为malloc和calloc之间的差异的重复,但我仍然想问一下。
我知道calloc initilizes的内存块,在这里我的问题是没有专注于该部分。
我的问题是
malloc的定义表示它分配一个指定大小的内存块。
calloc表示它分配了多块内存,每块内存大小相同。
这一块内存的分配和多块内存的区别是两者之间的真正区别吗?
因为我觉得我们可以用malloc来做同样的事情,这可以通过calloc完成。
例如 :
int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));
和
int *ptr;
ptr=(int *) calloc(100,sizeof(int));
最终会分配100倍int所需的内存。
你的代码示例是正确的...由ptr
指向的实际内存将是相同的大小(即100个int
对象的堆上的数组)。 正如其他人所说的,调用calloc
实际上会将内存清零,因为malloc
只会给你一个指向该内存的指针,并且内存可能有或没有全部为零。 例如,如果你得到的是从另一个对象中回收的内存,那么对malloc
的调用仍然具有它以前使用的值。 因此,如果您将内存视为“干净”,并且不要使用某些默认值对其进行初始化,则最终会导致程序中出现某种意外行为。
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
。
那么calloc
也会初始化内存块以包含与malloc
不同的零。
上一篇: malloc and calloc