malloc() — ストレージ・ブロックの予約
フォーマット
#include <stdlib.h>
void *malloc(size_t size);
言語レベル
ANSI
スレッド・セーフ
はい
説明
malloc() 関数は、size バイトのストレージ・ブロックを予約します。 calloc() 関数とは異なり、malloc() はすべてのエレメントを 0 に初期化するわけではありません。非テラスペース malloc() の最大サイズは 16,711,568 バイトです。
注:
- すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
- C ソース・コードを変更せずに、単一レベル・ストア・ストレージの代わりにテラスペース・ストレージを使用する場合、コンパイラー・コマンドで TERASPACE(*YES *TSIFC) パラメーターを指定します。これにより、malloc() ライブラリー関数が _C_TS_malloc() (テラスペース・ストレージでのカウンター・パート) にマップされます。_C_TS_malloc() への各呼び出しにより割り振り可能なテラスペース・ストレージの最大量は、2GB - 224 バイト、つまり 2,147,483,424 バイトです。単一の要求で 2147483408 バイトより多く必要な場合は、_C_TS_malloc64(unsigned
long long int); を呼び出します。
詳細については、「ILE 概念」のマニュアルを参照してください。
- 活動化グループ内の MI プログラムで使用中のテラスペース・ストレージに関する現在の統計に対しては、_C_TS_malloc_info 関数を呼び出します。 この関数は、全バイト数、割り振りバイト数とブロック数、割り振られていないバイト数とブロック数、要求バイト数、埋め込みバイト数、およびオーバーヘッド・バイト数などの情報を戻します。 _C_TS_malloc() 関数および _C_TS_malloc64() 関数で使用されるメモリー構造に関する詳細情報を得る場合は、_C_TS_malloc_debug() 関数を呼び出します。この関数が戻す情報を利用して、メモリーの破損問題を識別することができます。
- 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。詳細については、_C_Quickpool_Init() — 高速プール・メモリー・マネージャーの初期化を参照してください。
戻り値
malloc() 関数は、予約したスペースを指すポインターを戻します。戻り値が示すストレージ・スペースは、任意のタイプのオブジェクトのストレージ用に適切に位置合わせされます。十分なストレージが使用できない場合、あるいは size がゼロと指定してある場合には、戻り値は NULL になります。
例
この例では、必要とされる配列項目の数を求めるプロンプトを出し、次にその項目がストレージで必要とするスペースを予約します。
この例では、malloc() が正常の場合は、項目に値を割り当てて各項目を出力し、正常ではない場合は、エラーを出力します。
#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 *) malloc( num * sizeof( long ))) != NULL )
{
for ( i = 0; i < num; ++i ) /* put values in array */
*index++ = i; /* using pointer notation */
for ( i = 0; i < num; ++i ) /* print the array out */
printf( "array[ %i ] = %i¥n", i, array[i] );
}
else { /* malloc error */
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
array[ 3 ] = 3
array[ 4 ] = 4
*/