malloc() — ストレージ・ブロックの予約

形式

#include <stdlib.h>
void *malloc(size_t size);

言語レベル

ANSI

スレッド・セーフ

はい

説明

malloc() 関数は、 size バイトのストレージ・ブロックを予約します。 calloc() 関数とは異なり、 malloc() はすべてのエレメントを 0に初期化するわけではありません。 非テラ・スペース malloc() の最大サイズは 16711568 バイトです。

注:
  1. すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。 したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
  2. 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 概念」のマニュアルを参照してください。

  3. 活動化グループ内の MI プログラムで使用中のテラスペース・ストレージに関する現在の統計に対しては、_C_TS_malloc_info 関数を呼び出します。 この関数は、全バイト数、割り振りバイト数とブロック数、割り振られていないバイト数とブロック数、要求バイト数、埋め込みバイト数、およびオーバーヘッド・バイト数などの情報を戻します。 _C_TS_malloc() 関数および _C_TS_malloc64() 関数によって使用されるメモリー構造に関する詳細情報を取得するには、 _C_TS_malloc_debug() 関数を呼び出します。 この関数が戻す情報を利用して、メモリーの破損問題を識別することができます。
  4. 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。 詳しくは、 _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
*/

関連情報