calloc() — ストレージの予約と初期化
フォーマット
#include <stdlib.h>
void *calloc(size_t num, size_t size);
言語レベル
ANSI
スレッド・セーフ
はい
説明
calloc() 関数は、それぞれの長さが size バイトの num エレメントの配列用にストレージ・スペースを予約します。 calloc() 関数は次に、各エレメントのすべてのビットを初期値の 0 にします。
戻り値
calloc() 関数は、予約したスペースを指すポインターを戻します。戻り値が示すストレージ・スペースは、任意のタイプのオブジェクトのストレージ用に適切に位置合わせされます。型を指すポインターを取得するには、戻り値に対して型キャストを使用します。 十分なストレージがない場合、あるいは num または size が 0 の場合は、戻り値は NULL です。
注:
- すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
- C ソース・コードを変更せずに、単一レベル・ストア・ストレージの代わりにテラスペース・ストレージを使用する場合、コンパイラー・コマンドで TERASPACE(*YES *TSIFC) パラメーターを指定します。これにより、calloc() ライブラリー関数が _C_TS_calloc() (テラスペース・ストレージでの calloc() ライブラリー関数のカウンター・パート) にマップされます。_C_TS_calloc() への各呼び出しにより割り振り可能なテラスペース・ストレージの最大量は、2GB - 224 バイト、つまり 2,147,483,424 バイトです。
テラスペース・ストレージについて詳しくは、「ILE 概念」のマニュアルを参照してください。
- 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。詳細については、_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
*/