名前空間
変種
操作

calloc

提供: cppreference.com
< c‎ | memory
ヘッダ <stdlib.h> で定義
void* calloc( size_t num, size_t size );

サイズ size のオブジェクト num 個の配列用のメモリを確保し、確保された記憶域の全ビットをゼロに初期化します。

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

size がゼロの場合、動作は処理系定義です (ヌルポインタが返されるかもしれませんし、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません)。

calloc はスレッドセーフです。 引数を通して可視なメモリ位置にのみアクセスし、いかなる静的記憶域にもアクセスしないかのように振舞います。

メモリ領域を解放する free または realloc の以前の呼び出しは、同じメモリ領域またはその一部を確保する calloc の呼び出しに対して同期します。 この同期は解放関数によるそのメモリに対するいかなるアクセスよりも後でかつ calloc によるそのメモリに対するいかなるアクセスよりも前に発生します。 個々の特定のメモリ領域を操作するすべての確保関数および解放関数に単一の全順序が存在します。

(C11以上)

目次

[編集] 引数

num - オブジェクトの数
size - 各オブジェクトのサイズ

[編集] 戻り値

成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを回避するためには、返されたポインタは free() または realloc() で解放しなければなりません。

失敗した場合は、ヌルポインタを返します。

[編集] ノート

アライメント要件のため、確保されるバイト数は num*size と等しいとは限りません。

全ビットゼロの初期化は浮動小数点数やポインタがそれぞれ 0.0 やヌルポインタ値に初期化されることを保証しません (すべての一般的なプラットフォームで真ではありますが)。

元々 (C89 で)、サイズゼロに対するサポートは以下のようなコードに対応するために追加されました。

OBJ *p = calloc(0, sizeof(OBJ)); // "zero-length" placeholder
...
while(1) { 
    p = realloc(p, c * sizeof(OBJ)); // reallocations until size settles
    ... // code that may change c or break out of loop
}

[編集]

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p1 = calloc(4, sizeof(int));    // allocate and zero out an array of 4 int
    int *p2 = calloc(1, sizeof(int[4])); // same, naming the array type directly
    int *p3 = calloc(4, sizeof *p3);     // same, without repeating the type name
 
    if(p2) {
        for(int n=0; n<4; ++n) // print the array
            printf("p2[%d] == %d\n", n, p2[n]);
    }
 
    free(p1);
    free(p2);
    free(p3);
}

出力:

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.2 The calloc function (p: 348)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.3.1 The calloc function (p: 313)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.3.1 The calloc function

[編集] 関連項目