我知道这个问题可能被标记为malloc和calloc之间的区别重复,但我还是想问一下 .
我知道calloc启动了内存块,这里我的问题并不是关注那个部分 .
我的问题是
malloc的定义说它分配了一个指定大小的内存块 .
而calloc说它分配了多个内存块,每块内存大小相同 .
这个分配一块内存和多块内存是两者之间真正的区别吗?
因为我觉得我们可以使用malloc做同样的事情 .
例如 :
int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));
和
int *ptr;
ptr=(int *) calloc(100,sizeof(int));
最终将分配int所需内存的100倍 .
6 回答
这个已在此网站上提到,但从其他答案来看,我认为值得重复;乘以两个整数可能会导致溢出,如果发生这种情况,
可能不会有所需的结果(并且很可能导致后来的分段错误) . 对于这些情况,
calloc(num,size)
应该是首选(尽管你也可以在调用malloc之前测试溢出,如果事实calloc()
将新分配的内存初始化为零困扰你) .两者之间的主要区别是calloc将内存块初始化为零,而malloc创建的内存块包含垃圾值 .
所以更适合使用calloc而不是malloc来避免代码中的不确定性 .
那么
calloc
也初始化内存块以包含零,这与malloc
不同 .是的,主要区别如上所述 . 从操作系统内存分配的角度来看,calloc()也比malloc()慢 .
在程序接触malloc()之前,malloc()返回指针不会触及实际内存 . 而calloc()则使用RAM返回内存 .
您的代码示例是正确的...
ptr
指向的实际内存大小相同(即100个int
对象堆上的数组) . 正如其他人所提到的那样,对calloc
的调用实际上会将该内存清零,因为malloc
只会给你一个指向该内存的指针,而内存可能也可能没有全部为零 . 例如,如果你获得了从另一个对象中回收的内存,那么对malloc
的调用仍将具有之前使用的值 . 因此,如果您将内存视为"clean",并且在程序中最终会出现某种类型的意外行为 .calloc
用ZERO填充内存 .相当于
因此,如果您打算将分配的内存设置为零,那么使用
malloc
,您必须计算n*m
两次,或使用临时变量,这就是calloc
的作用 .编辑:我刚刚阅读了ISO C标准,发现无处指定
calloc
的实现应该检查是否n*m
溢出,即它是否超过C99标准中的常量SIZE_MAX
.