calloc() — ストレージの予約と初期化

フォーマット

#include <stdlib.h>
void *calloc(size_t num, size_t size);

言語レベル

ANSI

スレッド・セーフ

はい

説明

calloc() 関数は、それぞれの長さが size バイトの num エレメントの配列用にストレージ・スペースを予約します。 calloc() 関数は次に、各エレメントのすべてのビットを初期値の 0 にします。

戻り値

calloc() 関数は、予約したスペースを指すポインターを戻します。戻り値が示すストレージ・スペースは、任意のタイプのオブジェクトのストレージ用に適切に位置合わせされます。型を指すポインターを取得するには、戻り値に対して型キャストを使用します。 十分なストレージがない場合、あるいは num または size0 の場合は、戻り値は NULL です。

注:
  1. すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
  2. C ソース・コードを変更せずに、単一レベル・ストア・ストレージの代わりにテラスペース・ストレージを使用する場合、コンパイラー・コマンドで TERASPACE(*YES *TSIFC) パラメーターを指定します。これにより、calloc() ライブラリー関数が _C_TS_calloc() (テラスペース・ストレージでの calloc() ライブラリー関数のカウンター・パート) にマップされます。_C_TS_calloc() への各呼び出しにより割り振り可能なテラスペース・ストレージの最大量は、2GB - 224 バイト、つまり 2,147,483,424 バイトです。

    テラスペース・ストレージについて詳しくは、「ILE 概念」のマニュアルを参照してください。

  3. 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。詳細については、_C_Quickpool_Init() — 高速プール・メモリー・マネージャーの初期化を参照してください。

次の例は必要な数の配列エントリーを求めるプロンプトを出し、それからエントリー用にストレージ内に十分なスペースを予約します。 calloc() が成功すると、例は各エントリーを出力します。それ以外の場合はエラーを出力します。
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
  long * array;                          /* start of the array            */
  long * index;                          /* index variable                */
  int    i;                              /* index variable                */
  int  num;                              /* number of entries of the array*/
 
  printf( "Enter the size of the array¥n" );
  scanf( "%i", &num);
 
                                            /* allocate num entries */
  if ( (index = array = (long *) calloc( num, sizeof( long ))) != NULL )
  {
 
    for ( i = 0; i < num; ++i )             /* put values in arr    */
       *index++ = i;                        /* using pointer no     */
 
    for ( i = 0; i < num; ++i )             /* print the array out  */
      printf( "array[%i ] = %i¥n", i, array[i] );
  }
  else
  { /* out of storage */
    perror( "Out of storage" );
    abort();
  }
}
/******************  Output should be similar to:  **********************
 
Enter the size of the array
array[ 0 ] = 0
array[ 1 ] = 1
array[ 2 ] = 2
*/