malloc 関数や,calloc 関数などで確保したメモリ領域のサイズを変更するには stdlib.h の realloc 関数を使用します.
#include <stdlib.h>
void *realloc( void *ptr, size_t size );
realloc 関数は,まず ptr が指すメモリ領域を解放し,その後,大きさが size である新しいメモリ領域を確保する関数です.新しいメモリ領域は可能な限り開放する前の古いメモリ領域の内容を引き継ぎます.古いメモリ領域の大きさを超えた部分の値は不定となります.
realloc 関数はメモリ領域の確保に成功した場合は,そのメモリ領域へのポインタを返し,失敗した場合は空ポインタ (NULL) を返します.
以下に realloc 関数を使用して確保したメモリ領域のサイズを変更するサンプルプログラムを示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
/* main */
int main(void) {
int i, *ptr;
/* intサイズ10個分のメモリ領域を確保 */
if ((ptr = (int *)malloc(sizeof(int) * 10)) == NULL ) {
fprintf(stderr, "メモリ領域が確保できません.\n");
return EXIT_FAILURE;
}
/* 確保したメモリ領域に値を格納して表示 */
printf("realloc 関数使用前.\n");
for ( i = 0; i < 10; i++ ) {
ptr[i] = i;
printf(" %d", ptr[i]);
}
printf("\n");
/* intサイズ10個分から15個分のメモリ領域に拡張する */
if ((ptr = (int *)realloc(ptr, sizeof(int) * 15)) == NULL){
fprintf(stderr, "メモリが確保できません。\n");
return EXIT_FAILURE;
}
/* 確保したメモリ領域に値を格納して表示 */
printf("\nrealloc 関数使用後.\n");
for ( i = 0; i < 15; i++ ) {
ptr[i] = i;
printf(" %d", ptr[i]);
}
printf("\n");
/* メモリ領域の解放 */
free(ptr);
return EXIT_SUCCESS;
}
サンプルプログラムの実行結果は以下のようになります.
realloc 関数使用前. 0 1 2 3 4 5 6 7 8 9 realloc 関数使用後. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.