calloc
| ヘッダー <stdlib.h> で定義 |
||
num 個のオブジェクトの配列のためにメモリを確保し、確保されたストレージのすべてのバイトをゼロに初期化します。
メモリ確保が成功した場合、基本的なアライメントを持つ任意のオブジェクト型に対して適切にアライメントされた、確保されたメモリブロック内の最低(最初)のバイトへのポインタを返します。
もし size がゼロの場合、その動作は実装定義です(ヌルポインタが返されるか、ストレージにアクセスするために使用できない非ヌルポインタが返される場合があります)。
|
メモリ領域を解放する free、free_sized、および free_aligned_sized(C23 以降) または realloc の以前の呼び出しは、同じまたは同じ領域の一部を確保する |
(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
[編集] 参考文献
- C23標準 (ISO/IEC 9899:2024)
- 7.22.3.2 The calloc function (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.22.3.2 The calloc function (p: 253)
- C11標準 (ISO/IEC 9899:2011)
- 7.22.3.2 The calloc function (p: 348)
- C99標準 (ISO/IEC 9899:1999)
- 7.20.3.1 The calloc function (p: 313)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.10.3.1 The calloc function
[編集] 関連項目
| C++ のドキュメント (calloc)
|