calloc是否将整个分配归零?

时间:2018-07-11 08:27:04

标签: c malloc calloc

C中的calloc函数用于分配清零的内存,该内存至少可以容纳请求的指定大小的元素数量。实际上,大多数内存分配器可能会分配更大的块,以提高效率并最大程度地减少碎片。在此类系统中,分配的实际可用块大小通常可以通过特殊功能(即_msizemalloc_usable_size)发现。

calloc将确保整个可用块为零,还是仅将请求的count * size部分分配为零?

3 个答案:

答案 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)

这取决于实现。该标准不需要将其设置为比请求的内存大小大零。

The standard说:

  

简介

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
     

说明

     

calloc函数为nmemb对象数组分配空间,每个对象的大小均为size。该空间初始化为所有零位。

我想说的很清楚,除了您在calloc调用中请求的空间之外,这不会强制将其他任何内容清零。

这来自existing implementation

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;
}

它只会将您请求的内存清零。其他实现可能会有所不同。