std::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

参阅

callocC 文档

版本历史

  • (当前 | 先前 2017年6月8日 (四) 07:23Fruderica讨论 | 贡献. . (2,033字节) (+92). . (撤销)
  • 当前 | 先前 2014年10月26日 (日) 16:57P12bot讨论 | 贡献 . . (1,941字节) (0). . (Fix some translations) (撤销)
  • 当前 | 先前 2013年7月2日 (二) 09:02P12bot讨论 | 贡献 . . (1,941字节) (-51). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 16:34P12bot讨论 | 贡献 . . (1,992字节) (+108). . (r2.7.3) (机器人添加:de, en, es, it, ru 去除:zh) (撤销)
  • 当前 | 先前 2012年10月27日 (六) 03:25P12讨论 | 贡献 . . (1,884字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 06:00TranslationBot讨论 | 贡献. . (1,884字节) (-63). . (Translated from the English version using Google Translate) (撤销)
  • 当前 | 先前 2012年10月25日 (四) 14:09P12讨论 | 贡献 . . (1,947字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (1,947字节) (+1,252). . (Translated from the English version using Google Translate) (撤销)
  • 当前 | 先前 2012年5月4日 (五) 15:22P12bot讨论 | 贡献 . . (695字节) (+136). . (r2.7.3) (机器人添加:en, fr, ja, pl, pt) (撤销)
  • 当前 | 先前 2012年5月1日 (二) 03:37P12讨论 | 贡献 . . (559字节) (0). . (1个修订: Import from Dokuwiki) (撤销)
  • 当前 | 先前) 2012年5月1日 (二) 03:37P12讨论 | 贡献. . (559字节) (+559). . (Import from dokuwiki)