std::calloc

来自cppreference.com
< cpp‎ | memory‎ | c
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
 
定义于头文件 <cstdlib>
void* calloc( std::size_t num, std::size_t size );

分配 num 个大小为 size 的对象的数组,并初始化所有位为零。

若分配成功,则返回指向为任何对象类型适当对齐的,被分配内存块最低(首)字节的指针。

size 为零,则行为是实现定义的(可以返回空指针,亦可返回某个不可用于访问存储的非空指针)

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

对这些分配或解分配特定存储单元的函数调用以单独全序出现,并且在此顺序中,每个解分配调用先发生于下个分配(若存在)。

(C++11 起)

目录

[编辑] 参数

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

[编辑] 返回值

成功时,返回指向新分配内存起始的指针。返回的指针必须以 std::free()std::realloc() 解分配。

失败时,返回空指针。

[编辑] 注意

因为对齐要求,分配的字节数不需要等于 num*size

将所有位初始化为零不保证浮点数或指针各被初始化到 0.0 与空指针值(尽管大多数平台上这为 true )

最初( C89 中),添加对零大小的支持是为了接纳下面这种代码

OBJ *p = calloc(0, sizeof(OBJ)); // “零长度”占位
...
while(1) { 
    p = realloc(p, c * sizeof(OBJ)); // 重分配直至大小稳定
    ... // 可能更改 c 或打破循环的代码
}

[编辑] 示例

#include <iostream>
#include <cstdlib>
 
int main()
{
    int* p1 = (int*)std::calloc(4, sizeof(int)); // 分配并清零 4 个 int 的数组
    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

[编辑] 参阅

callocC 文档