std::calloc

来自cppreference.com
< cpp‎ | memory‎ | c
 
 
内存管理库
(仅用于阐述*)
分配器
未初始化内存算法
受约束的未初始化内存算法
内存资源
未初始化存储(C++20 前)
(C++17 弃用)
(C++17 弃用)
垃圾收集器支持(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 前)
 
在标头 <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 与空指针值(尽管所有常见平台上都是如此)。

最初(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 的数组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

[编辑]参阅

calloc 的 C 文档
close