realloc() — 予約ストレージ・ブロック・サイズの変更

形式

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

言語レベル

ANSI

スレッド・セーフ

はい

説明

realloc() 関数は、以前に予約されたストレージ・ブロックのサイズを変更します。 ptr 引数は、ブロックの先頭を指しています。 size 引数は、ブロックの新規サイズ (バイト単位) を指定しています。 ブロックの内容は、新旧サイズの短い方に達するまでは変更されません。

ptrNULLの場合、 realloc()size バイトのストレージ・ブロックを予約します。 これによって、必ずしも各エレメントのすべてのビットが初期値 0 にされるわけではありません。

size0 で、 ptrNULLでない場合、 realloc()ptr に割り振られたストレージを解放し、 NULL を戻します。

注:
  1. すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。 したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
  2. 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。 詳しくは、_C_Quickpool_Init ()-高速プール・メモリー・マネージャーの初期化 を参照してください。

戻り値

realloc() 関数は、再割り振りされたストレージ・ブロックを指すポインターを戻します。 ブロックの保管場所は、 realloc() 関数によって移動することができます。 したがって、 realloc() 関数に対する ptr 引数は、必ずしも戻り値と同じではありません。

size0の場合、 realloc() 関数は NULLを戻します。 指定されたサイズまでブロックを拡張するための十分なストレージがない場合、元のブロックは変更されず、 realloc() 関数は NULLを返します。

戻り値が指しているストレージは、不特定型のオブジェクトのストレージに位置合わせされます。

C ソース・コードを変更せずに、単一レベル・ストア・ストレージの代わりにテラスペース・ストレージを使用する場合、コンパイラー・コマンドで TERASPACE(*YES *TSIFC) パラメーターを指定します。 これにより、 realloc() ライブラリー関数が、対応するテラスペース・ストレージである _C_TS_realloc()にマップされます。 _C_TS_realloc() への各呼び出しにより割り振り可能なテラスペース・ストレージの最大量は、2GB - 240、または 214743408 バイトです。 テラスペース・ストレージについて詳しくは、「ILE 概念」のマニュアルを参照してください。

この例では、 array のプロンプト・サイズにストレージを割り振り、 realloc() を使用して、配列の新しいサイズを保持するブロックを再割り振りします。 配列の内容は、各割り振りの後で出力されます。
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
  long * array;    /* start of the array */
  long * ptr;      /* pointer to array   */
  int    i;        /* index variable     */
  int  num1, num2; /* number of entries of the array */
  void print_array( long *ptr_array, int size);
  printf( "Enter the size of the array\n" );
  scanf( "%i", &num1);
  /* allocate num1 entries using malloc() */
  if ( (array = (long *) malloc( num1 * sizeof( long ))) != NULL )
  {
     for ( ptr = array, i = 0; i < num1 ; ++i ) /* assign values */
        *ptr++ = i;
     print_array( array, num1 );
     printf("\n");
  }
  else { /*  malloc error  */
    perror( "Out of storage" );
    abort();
  }
  /* Change the size of the array ... */
  printf( "Enter the size of the new array\n" );
  scanf( "%i", &num2);
  if ( (array = (long *) realloc( array, num2* sizeof( long ))) != NULL )
  {
     for ( ptr = array + num1, i = num1; i <= num2; ++i )
        *ptr++ = i + 2000;  /* assign values to new elements */
     print_array( array, num2 );
  }
  else { /* realloc error */
    perror( "Out of storage" );
    abort();
  }
}
 
void print_array( long  * ptr_array, int size )
{
  int i;
  long * index = ptr_array;
  printf("The array of size %d is:\n", size);
  for ( i = 0; i < size; ++i )           /* print the array out    */
    printf( "  array[ %i ] = %li\n", i, ptr_array[i] );
}
 
/**** If the initial value entered is 2 and the second value entered 
      is 4, then the expected output is:
Enter the size of the array
The array of size 2 is:
  array[ 0 ] = 0
  array[ 1 ] = 1
Enter the size of the new array
The array of size 4 is:
  array[ 0 ] = 0
  array[ 1 ] = 1
  array[ 2 ] = 2002
  array[ 3 ] = 2003                                                */

関連情報