calloc 是否将整个分配归零?

Does calloc zero out the entire allocation?

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

calloc 会确保整个可用块都清零,还是只会将分配的请求计数*大小部分清零?

这取决于实施。该标准不要求它比请求的内存大小更归零。

The standard 说:

Synopsis

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

Description

The calloc function allocates space for an array of nmemb objects, each of whose size is size. The space is initialized to all bits zero.

我想说的是,很明显,除了您在 calloc 调用中请求的 space 之外,这不会强制对任何内容进行清零。

这来自 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;
}

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

只能保证将请求的分配归零。

你应该永远不要依赖过度分配。

简短回答:如果没有更多信息,就不可能说,但我不会指望它。

更长的答案:

如果你要求 N 个字节,C 标准保证(除非失败)calloc 会给你 N 个字节,并且它们都为 0。就 C 标准而言,这就是我们能说的。

如果您有一个 C 库,它 (a) 有时会提供超过 N 个字节,并且 (b) 会为您提供明确定义的方法来找出有多少字节,并且 (c) 保证您可以使用它这些额外的字节,我们显然不能说这些字节是否保证为 0。 C 标准没有告诉我们,我们不知道您使用的是什么 C 库或它的特殊保证是什么。

由于可能为您提供 (a)、(b) 和 (c) 的是您的 C 库,因此您将不得不查阅该特定库的文档、源代码、and/or 作者以了解回答问题 (d) 是否保证任何额外内存为 0?这个问题没有通用的、非图书馆特定的答案。