Namespaces
Variants

calloc

From cppreference.net
ヘッダーで定義 <stdlib.h>
void * calloc ( size_t num, size_t size ) ;

num 個の size オブジェクトの配列に対してメモリを割り当て、割り当てられたストレージ内の全バイトをゼロで初期化します。

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

size がゼロの場合、動作は実装定義です(ヌルポインタが返される可能性がある、またはストレージへのアクセスに使用できない非ヌルポインタが返される可能性があります)。

calloc はスレッドセーフである:引数を通じて見えるメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように振る舞う。

メモリ領域を解放する free free_sized 、および free_aligned_sized (C23以降) または realloc の以前の呼び出しは、同じメモリ領域全体または一部を割り当てる calloc の呼び出しと 同期する 。この同期は、解放関数によるメモリへのアクセス後かつ calloc によるメモリへのアクセス前に発生する。各特定のメモリ領域を操作するすべての割り当て関数と解放関数には単一の全順序が存在する。

(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関数

関連項目