名前空間
変種
操作

calloc

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

num 個のオブジェクトの配列のためにメモリを確保し、確保されたストレージのすべてのバイトをゼロに初期化します。

メモリ確保が成功した場合、基本的なアライメントを持つ任意のオブジェクト型に対して適切にアライメントされた、確保されたメモリブロック内の最低(最初)のバイトへのポインタを返します。

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

calloc はスレッドセーフです。引数を通じて可視なメモリ位置のみにアクセスし、静的ストレージにはアクセスしないように動作します。

メモリ領域を解放する freefree_sized、および free_aligned_sized(C23 以降) または 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

[編集] 参考文献

  • 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

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)