realloc

メモリの割り当てを変更する

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

【説明】
指定したヒープメモリのブロックを、指定したサイズに変更して再度割当てます。古いメモリブロックにあったデータは可能な限り新しいメモリブロックにコピーされます。

【引数】
void *ptr  : malloc関数、calloc関数、realloc関数を用いて確保したヒープメモリへのポインタ。
         NULL(0)を指定した場合には、mallocと同様の動作をします。
size_t size : 変更したいメモリのバイトサイズ

size_t は stdlib.h の中でtypedefされ、一般にunsignedです。

【戻り値】
成功時 : 再確保したメモリブロックを指すポインタ (void *についてはmalloc関数参照)
       このアドレスは、元のブロックのアドレスと異なることがあります。
失敗時 : NULL (メモリ不足により指定サイズ分のメモリが確保できないとき)

【使用例】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char *ptr;
   char *tmp;

   /* メモリを割り当てる */
   if ((ptr = (char *)malloc(10)) == NULL) {
      printf("malloc時にメモリが確保できません\n");
      exit(EXIT_FAILURE);
   }
   strcpy(ptr,"computer");
   printf("文字列:%s アドレス:%p\n",ptr,ptr);
   
   /* メモリを再度割り当てる */
   if ((tmp = (char *)realloc(ptr,200)) == NULL) {
      printf("realloc時にメモリが確保できません\n");
      free(ptr);  /* 元のptrを解放して終了 */
      exit(EXIT_FAILURE);
   }
   else {
      ptr = tmp;
      /* reallocの戻り値は一度別変数に取り、
         NULLでないことを確認してから元の変数に代入するのが定石 */
   }
   printf("文字列:%s 新アドレス:%p\n",ptr,ptr);

   /* メモリの解放 */
   free(ptr);

   return 0;
}

(参考)%p書式指定 
printf関数の書式指定「%p」は、ポインタとして出力するときに用いられるものです。
表示形式は処理系に依存します。

【実行結果例】
文字列:computer アドレス:11C4
文字列:computer 新アドレス:15D6

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved