malloc和calloc

har*_*ris 2 c malloc memory-management calloc

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

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

我的问题是

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

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

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

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

例如 :

int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));
Run Code Online (Sandbox Code Playgroud)

int *ptr;
ptr=(int *) calloc(100,sizeof(int));
Run Code Online (Sandbox Code Playgroud)

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

vul*_*ino 7

calloc 用ZERO填充内存.

p=calloc(n, m); 
Run Code Online (Sandbox Code Playgroud)

相当于

p=malloc(n*m); 
memset(p, 0, m * n);
Run Code Online (Sandbox Code Playgroud)

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

编辑:我刚刚阅读了ISO C标准,发现无处指定calloc应该检查是否n*m溢出,即是否超过SIZE_MAXC99标准中的常量.


Jas*_*son 6

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