C言語 確保した動的メモリサイズの変更 - stdlib.h - [ realloc ]

2008.11.01 Saturday | by LRESULT


的メモリ確保の第三弾は、realloc()です。

※ 第一弾 malloc()は、こちら
※ 第二弾 calloc()は、こちら
※ 第四弾 free()は、こちら

realloc()は、確保された領域(サイズ)を拡張したり縮小したりする事が出来る関数です。
つまり、malloc()やcalloc()で確保した領域を、あと10バイトほど大きくしたいといった場合に有効です。
また、サイズ変更する前に設定されていたデータは保持されます。


realloc
書式 void* realloc( void *ptr, size_t size )
機能 確保した動的メモリサイズの変更
引数 void *ptr : malloc()やcalloc()で確保した領域のポインタ
size_t size : 変更したい領域のバイト数
戻り値 成功すると、改めて確保した領域のポインタを返し、
失敗すると、NULLを返します。


込み入った話になりますが、realloc()で領域サイズを変更すると
  戻り値である領域の先頭アドレスが変わってしまう場合があります。
  その場合は、malloc()で取得したメモリ領域は自動で解放され、
  新たに確保された領域アドレスが返されます。





サンプルコード
まずは、malloc()で動的メモリ領域を20バイト確保し、文字列「realloc test」を書き込みます。
次に、realloc()で領域を100バイトに拡張しデータが保持されているかを確認してみます。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char *mbuf = NULL;
  char *tmp = NULL;
  int sz;

  sz = 20 * sizeof( char );
  mbuf = (char *)malloc( sz );
  if( mbuf == NULL ){
    printf( "メモリ確保に失敗しました¥n" );
    return -1;
  }

  sprintf( mbuf, "realloc test¥n" );

  sz = 100 * sizeof( char );
  tmp = (char *)realloc( mbuf, sz );
  if( tmp == NULL ){
    printf( "メモリ確保に失敗しました¥n" );
    free( mbuf );
    return -1;
  }
  else{
    mbuf = tmp;
  }   

  /* データが保持されている事を確認 */
  printf( "%s", mbuf );

  free( mbuf );
  return 0;
}




結果
realloc test
と、表示され、動的メモリ領域を拡張しても
データの内容が引き継がれているのが確認出来ました。

realloc()の戻り値を受け取るポインタは、
  必ずmalloc()のポインタとは違うポインタで受け取るようにして下さい。
  もし、NULLを返してきた場合に、解放するメモリのアドレスが上書きされてしまう為です。

カテゴリ:C言語 stdlib.h | 18:30 | comments(0) | trackbacks(0) | -


コメントする











この記事のトラックバックURL

トラックバック機能は終了しました。

トラックバック