Namespaces
Variants

std:: calloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <cstdlib>
void * calloc ( std:: size_t num, std:: size_t size ) ;

为包含 num 个大小为 size 的对象的数组分配内存,并将其初始化为全零位( 隐式创建 目标区域中的对象)。

如果分配成功,返回指向已分配内存块中最低(首个)字节的指针,该内存块已针对任何对象类型进行适当对齐。

如果 size 为零,其行为由实现定义(可能返回空指针,也可能返回某个不可用于访问存储的非空指针)。

以下函数要求是线程安全的:

对这些函数分配或释放特定存储单元的调用以单一全序发生,且每个这样的释放调用 先发生于 该顺序中的下一个分配调用(如果存在)。

(since C++11)

目录

参数

num - 对象数量
size - 每个对象的大小

返回值

成功时,返回指向新分配内存起始位置的指针。为避免内存泄漏,必须使用 std::free() std::realloc() 释放返回的指针。

失败时,返回空指针。

注释

由于对齐要求,分配的字节数不一定等于 num * size

将所有位初始化为零并不能保证浮点数或指针会分别被初始化为0.0和空指针值(尽管在所有常见平台上确实如此)。

最初(在C89中),添加对零大小的支持是为了适应诸如

OBJ *p = calloc(0, sizeof(OBJ)); // "零长度"占位符
...
while (1)
{ 
    p = realloc(p, c * sizeof(OBJ)); // 重新分配内存直到大小稳定
    ... // 可能改变c或跳出循环的代码
}

示例

#include <cstdlib>
#include <iostream>
int main()
{
    int* p1 = (int*)std::calloc(4, sizeof(int)); // 分配并清零包含4个整数的数组
    int* p2 = (int*)std::calloc(1, sizeof(int[4])); // 相同功能,直接指定数组类型
    int* p3 = (int*)std::calloc(4, sizeof *p3); // 相同功能,无需重复类型名
    if (p2)
        for (int n = 0; n < 4; ++n) // 打印数组内容
            std::cout << "p2[" << n << "] == " << p2[n] << '\n';
    std::free(p1);
    std::free(p2);
    std::free(p3);
}

输出:

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

参阅

C 文档 关于 calloc