C中的calloc
函数用于分配清零的内存,该内存至少可以容纳请求的指定大小的元素数量。实际上,大多数内存分配器可能会分配更大的块,以提高效率并最大程度地减少碎片。在此类系统中,分配的实际可用块大小通常可以通过特殊功能(即_msize
或malloc_usable_size
)发现。
calloc
将确保整个可用块为零,还是仅将请求的count * size部分分配为零?
答案 0 :(得分:4)
只能保证将请求的分配归零。
您切勿依赖过度分配。
答案 1 :(得分:4)
简短的回答:没有更多信息,这是不可能说的,但我不会指望它。
更长的答案:
如果您要求N个字节,C标准将保证(除非失败)calloc
将为您提供N个字节,并且它们全为0。就C标准而言,仅此而已我们可以说。
如果您有一个C库,其中(a)有时会给您提供超过N个字节的信息,而(b)会为您提供一种明确的方法来找出多少个字节,并且(c)保证您可以使用这些额外的个字节,我们显然不能说这些字节是否保证为0。 C标准没有告诉我们,我们也不知道您使用的是什么C库或它的特殊保证。
由于可能是您的C库为您提供(a),(b)和(c),因此您将必须查阅该特定库的文档,源代码和/或作者来回答问题( d)是否保证任何额外的内存为0?此问题没有通用的,非库特定的答案。
答案 2 :(得分:3)
这取决于实现。该标准不需要将其设置为比请求的内存大小大零。
简介
#include <stdlib.h> void *calloc(size_t nmemb, size_t size);
说明
calloc函数为nmemb对象数组分配空间,每个对象的大小均为size。该空间初始化为所有零位。
我想说的很清楚,除了您在calloc
调用中请求的空间之外,这不会强制将其他任何内容清零。
PTR memset (PTR dest, register int val, register size_t len) {
register unsigned char *ptr = (unsigned char*)dest;
while (len-- > 0)
*ptr++ = val;
return dest;
}
void bzero (void *to, size_t count) {
memset (to, 0, count);
}
PTR calloc (size_t nelem, size_t elsize) {
register PTR ptr;
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
ptr = malloc (nelem * elsize);
if (ptr) bzero (ptr, nelem * elsize);
return ptr;
}
它只会将您请求的内存清零。其他实现可能会有所不同。