realloc


目次に戻る


昨日に引き続きメモリの動的確保を行う関数を紹介します。
 
協商解するreallocはmallocとどこが違うのかというと、reallocは前まで確保していた 領域を内容はそのままにして、広げたり狭めたりできるのです。たとえば、大きさ100の 領域を確保していたけど、内容はそのままで大きさを200に拡張したいという場合、 mallocを使うと次のような感じになります。
char *buff,*buff2;
buff = (char*)malloc( sizeof(char) * 100 );
    :
    :
/* 大きさを拡張する */
buff2 = (char*)malloc( sizeof(char) * 200 );
/* buffの内容をそのままbuff2にコピー */
memcpy( buff2 , buff , sizeof(char) * 100 );
/* 古い領域を開放 */
free( buff );
/* buffにbuff2を代入 */
buff = buff2;
    :
    :
/* メモリの解放 */
free( buff );
これでは、一時使用の変数を用意しなくてはいけない等面倒くさいです。上のリストを reallocを用いると次のようになります。
char *buff;
buff = (char*)malloc( sizeof(char) * 100 );
    :
    :
/* 大きさを拡張する */
buff = (char*)realloc( buff , sizeof(char) * 200 );
    :
    :
/* メモリの解放 */
free( buff );
また、reallocに渡す第一引数の値がNULLの場合はmallocと同じ動作をするので次のよう にもかけます。
char *buff=NULL;
buff = (char*)realloc( buff , sizeof(char) * 200 );
    :
    :
/* 大きさを拡張する */
buff = (char*)realloc( buff , sizeof(char) * 200 );
    :
    :
/* メモリの解放 */
free( buff );


目次に戻る