10

calloc分配num内存块,每个大小为size

void * calloc ( size_t num, size_t size );

为内存中的数组分配空间 为 num 个元素的数组分配一块内存,每个元素的大小为字节长,并将其所有位初始化为零。

相反,malloc分配一块大小为 的内存size

void * malloc ( size_t size );

分配内存块 分配一块大小字节的内存,返回一个指向块开头的指针。


两者之间有什么区别(除了零初始化calloc)?

calloc 的确切含义是num内存块,因为实际上返回的内存区域也是连续的。

我相信必须有一些区别,否则为这些方法定义两个不同的接口没有多大意义?

4

7 回答 7

4

抱歉,没有区别(但内存已清零)

Calloc() 在与数组一起使用时很有用,其中您有两个不同的值:数组的大小和单个单元格的维度。返回的区域内存在这两种情况下都是连续的,并且它们可能使用相同的数据结构来跟踪此类区域(但这取决于实现)

于 2012-09-19T07:58:22.023 回答
2

在实践中,他们做同样的事情。calloc 的优点是良好的实现将在执行所需的乘法运算以确定您需要多少内存时执行溢出检测。

如果你这样做:

void *
calloc(size_t nmemb, size_t size)
{
    size_t sz = nmemb * size;
    void *res = malloc(sz);

'sz' 可能最终不会是你所期望的那样。然后 malloc 将分配比调用者预期的要少得多,但调用者最终可以将返回的区域视为足够大。这会导致堆溢出,这将带来通常具有的所有安全隐患。

于 2012-09-19T07:55:35.627 回答
1

我试图找出calloc工作原理

我找到下面的代码

/* We use this function occasionally since the real implementation may
   be optimized when it can assume the memory it returns already is
   set to NUL.  */
void * weak_function
calloc (size_t nmemb, size_t size)
{   
  /* New memory from the trivial malloc above is always already cleared.
     (We make sure that's true in the rare occasion it might not be,
     by clearing memory in free, below.)  */
  size_t bytes = nmemb * size;

#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t) / 2))
  if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0)
      && size != 0 && bytes / size != nmemb)
    return NULL;

  return malloc (bytes);
}

可以看到 calloc 和 malloc 没有太大区别。

你可以在这里浏览 glibc 的代码

http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/dl-minimal.c

于 2012-09-19T12:39:54.870 回答
0

唯一真正的区别是使用 0 初始化calloc()

为什么calloc()使用块大小和块计数malloc()而不使用,我一直不清楚。

于 2012-09-19T07:55:26.860 回答
0

它们完全相同。Calloc希望您指定要分配多少给定大小的块,因为它用 0 初始化它们。底层结构完全相同。

于 2012-09-19T07:58:58.797 回答
0

你可以认为是calloc()

void* calloc(size_t nmemb, size_t size)
{
  const size_t nbytes = nmemb * size;
  void *p = malloc(nbytes);
  if(p != NULL)
    memset(p, 0, nbytes);
  return p;
}

请注意,它的实现可能完全不同,但它与上述功能等效。内存的“内部布局”没有区别,你得到一个连续的块。

于 2012-09-19T08:03:08.297 回答
0

Calloc()的。它的作用是将每个大小的 n 块分配给每个大小的size_t size块,然后将每个大小的块分配size_t size给 ZERO 。

于 2015-07-30T05:27:25.310 回答