std:: calloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<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
|