calloc

使用初始化为 0 的元素分配内存中的数组。

语法

void *calloc(
   size_t number,
   size_t size
);

参数

number
元素数量。

size
每个元素的长度(以字节为单位)。

返回值

calloc 返回指向已分配空间的指针。 返回值指向的存储空间与任何类型的对象的存储适当对齐。 若要获取指向类型而非 void 的指针,请在返回值中使用类型转换。

备注

calloc 函数为 number 元素的数组分配存储空间,每个长度为 size 字节。 将每个元素初始化为 0。

如果内存分配失败或请求的内存量超过 _HEAP_MAXREQcalloc 会将 errno 设置为 ENOMEM。 有关此错误代码和其他错误代码的信息,请参阅 errno_doserrno_sys_errlist_sys_nerr

在 Microsoft 实现中,如果 numbersize 为零,则 calloc 返回指向非零大小的已分配块的指针。 尝试通过返回的指针读取或写入会导致未定义的行为。

calloc 使用 C++ _set_new_mode 函数设置新的处理程序模式。 新的处理程序模式将指示 calloc 是否在失败时调用由 _set_new_handler 设置的新处理程序例程。 默认情况下,calloc 在失败时不调用新的处理程序例程来分配内存。 可以替代此默认行为,以便在 calloc 无法分配内存时,它可以调用新的处理程序例程,方法与 new 运算符出于相同原因无法分配内存时所执行的操作一样。 若要替代默认值,请在程序的早期调用:

_set_new_mode(1);

或链接到 NEWMODE.OBJ(请参阅链接选项)。

当应用程序与调试版的 C 运行时库链接时,calloc 将解析为 _calloc_dbg。 有关在调试过程中如何托管堆的详细信息,请参阅 CRT 调试堆

calloc 被标记为 __declspec(noalias)__declspec(restrict),也就是说确保该函数不能修改全局变量,并且指针返回不使用别名。 有关详细信息,请参阅 noaliasrestrict

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态

要求

例程 必需的标头
calloc <stdlib.h><malloc.h>

有关兼容性的详细信息,请参阅 兼容性

示例

// crt_calloc.c
// This program uses calloc to allocate space for
// 40 long integers. It initializes each element to zero.

#include <stdio.h>
#include <malloc.h>

int main( void )
{
   long *buffer;

   buffer = (long *)calloc( 40, sizeof( long ) );
   if( buffer != NULL )
      printf( "Allocated 40 long integers\n" );
   else
      printf( "Can't allocate memory\n" );
   free( buffer );
}
Allocated 40 long integers

另请参阅

内存分配
free
malloc
realloc