Namespaces
Variants

std:: calloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定義先ヘッダ <cstdlib>
void * calloc ( std:: size_t num, std:: size_t size ) ;

サイズ size のオブジェクト num 個分の配列にメモリを割り当て、すべてのビットをゼロで初期化します( 暗黙的にオブジェクトを生成 して宛先領域に配置します)。

確保が成功した場合、任意のオブジェクト型に対して適切にアライメントされた、確保されたメモリブロック内の最も低位(最初)のバイトへのポインタを返します。

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

関連項目