std::calloc

来自cppreference.com
< cpp‎ | memory‎ | c
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
动态内存管理
智能指针
(C++11)
(C++11)
(C++11)
(C++17 前)
(C++11)
(C++23)
分配器
内存资源
未初始化存储
未初始化内存算法
受约束的未初始化内存算法
垃圾收集支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
杂项
(C++20)
(C++11)
(C++11)
C 库
calloc
低层内存管理
 
定义于头文件 <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

参阅