函数
<cstdlib>

calloc

void* calloc (size_t num, size_t size);
分配并零初始化数组
分配一个内存块,用于存放 num 个元素,每个元素的大小为 size 字节,并将其所有位初始化为零。

有效结果是分配一个大小为 (num*size) 字节的零初始化内存块。

如果 size 为零,返回值取决于具体的库实现(它可能是一个也可能不是一个空指针),但返回的指针不得被解引用。

参数

num
要分配的元素数量。
size
每个元素的大小。

size_t 是一个无符号整数类型。

返回值

成功时,返回指向函数分配的内存块的指针。
此指针的类型始终为 void*,可以转换为所需的数据指针类型以便解引用。
如果函数未能分配所需的内存块,则返回空指针

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* calloc example */
#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* calloc, exit, free */

int main ()
{
  int i,n;
  int * pData;
  printf ("Amount of numbers to be entered: ");
  scanf ("%d",&i);
  pData = (int*) calloc (i,sizeof(int));
  if (pData==NULL) exit (1);
  for (n=0;n<i;n++)
  {
    printf ("Enter number #%d: ",n+1);
    scanf ("%d",&pData[n]);
  }
  printf ("You have entered: ");
  for (n=0;n<i;n++) printf ("%d ",pData[n]);
  free (pData);
  return 0;
}

此程序仅存储数字然后打印它们。但它存储的项目的数量可以随着程序的每次执行而适应,因为它在运行时分配了所需的内存。

数据竞争

只有返回指针所引用的存储才会被修改。调用不会访问任何其他存储位置。
如果函数重用了由释放函数(如 freerealloc)释放的同一存储单元,则这些函数会同步进行,以便在下一次分配之前完全完成释放。

异常 (C++)

无异常保证:此函数从不抛出异常。

另见