realloc() — 予約ストレージ・ブロック・サイズの変更
形式
#include <stdlib.h>
void *realloc(void *ptr, size_t size);言語レベル
ANSI
スレッド・セーフ
はい
説明
realloc() 関数は、以前に予約されたストレージ・ブロックのサイズを変更します。 ptr 引数は、ブロックの先頭を指しています。 size 引数は、ブロックの新規サイズ (バイト単位) を指定しています。 ブロックの内容は、新旧サイズの短い方に達するまでは変更されません。
ptr が NULLの場合、 realloc() は size バイトのストレージ・ブロックを予約します。 これによって、必ずしも各エレメントのすべてのビットが初期値 0 にされるわけではありません。
size が 0 で、 ptr が NULLでない場合、 realloc() は ptr に割り振られたストレージを解放し、 NULL を戻します。
- すべてのヒープ・ストレージは、呼び出し関数の活動化グループと関連付けられます。 したがって、ストレージの割り振り、割り振り解除、および再割り振りは同じ活動化グループ内で行ってください。 1 つの活動化グループ内でヒープ・ストレージを割り振って、そのストレージを異なる活動化グループから割り振り解除したり、再割り振りすることはできません。 活動化グループについての詳細は、「ILE 概念」のマニュアルを参照してください。
- 高速プール・メモリー・マネージャーが現行の活動化グループ内で使用可能にされている場合、ストレージは高速プール・メモリー・マネージャーを使用して検索されます。 詳しくは、_C_Quickpool_Init ()-高速プール・メモリー・マネージャーの初期化 を参照してください。
戻り値
realloc() 関数は、再割り振りされたストレージ・ブロックを指すポインターを戻します。 ブロックの保管場所は、 realloc() 関数によって移動することができます。 したがって、 realloc() 関数に対する ptr 引数は、必ずしも戻り値と同じではありません。
size が 0の場合、 realloc() 関数は NULLを戻します。 指定されたサイズまでブロックを拡張するための十分なストレージがない場合、元のブロックは変更されず、 realloc() 関数は NULLを返します。
戻り値が指しているストレージは、不特定型のオブジェクトのストレージに位置合わせされます。
C ソース・コードを変更せずに、単一レベル・ストア・ストレージの代わりにテラスペース・ストレージを使用する場合、コンパイラー・コマンドで TERASPACE(*YES *TSIFC) パラメーターを指定します。 これにより、 realloc() ライブラリー関数が、対応するテラスペース・ストレージである _C_TS_realloc()にマップされます。 _C_TS_realloc() への各呼び出しにより割り振り可能なテラスペース・ストレージの最大量は、2GB - 240、または 214743408 バイトです。 テラスペース・ストレージについて詳しくは、「ILE 概念」のマニュアルを参照してください。
例
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 */