calloc
|
ヘッダーで定義
<stdlib.h>
|
||
num 個の size オブジェクトの配列に対してメモリを割り当て、割り当てられたストレージ内の全バイトをゼロで初期化します。
確保が成功した場合、あらゆるオブジェクト型の 基本アラインメント に適切に整列された、確保されたメモリブロックの最下位(最初)のバイトへのポインタを返します。
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)); // 「ゼロ長」プレースホルダー ... while(1) { p = realloc(p, c * sizeof(OBJ)); // サイズが確定するまで再割り当て ... // cを変更する可能性のあるコード、またはループを抜けるコード }
例
#include <stdio.h> #include <stdlib.h> int main(void) { int* p1 = calloc(4, sizeof(int)); // 4つのintの配列を確保しゼロ初期化 int* p2 = calloc(1, sizeof(int[4])); // 同じ処理、配列型を直接指定 int* p3 = calloc(4, sizeof *p3); // 同じ処理、型名の重複を避けて if (p2) { for (int n = 0; n < 4; ++n) // 配列を出力 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 calloc関数 (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 7.22.3.2 calloc関数 (p: 253)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.22.3.2 calloc関数 (p: 348)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.20.3.1 calloc関数 (p: 313)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.10.3.1 calloc関数
関連項目
|
C++ documentation
for
calloc
|