calloc
ヘッダ <stdlib.h> で定義
|
||
サイズ size
のオブジェクト num
個の配列用のメモリを確保し、確保された記憶域の全ビットをゼロに初期化します。
確保が成功した場合は、あらゆるオブジェクト型に対して適切にアラインされた、確保されたメモリブロックの最も低位の (最初の) バイトを指すポインタを返します。
size
がゼロの場合、動作は処理系定義です (ヌルポインタが返されるかもしれませんし、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません)。
メモリ領域を解放する free または realloc の以前の呼び出しは、同じメモリ領域またはその一部を確保する 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