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