2012/06/13

C言語 realloc 動的メモリのリサイズ

確保していたメモリが足りなくなった場合、メモリを拡張する必要がある。C言語ではreallocを使うようだ。早速試してみた。

reallocのお試し

#include <stdio.h>
#include <stdlib.h>
/* 動的メモリのリサイズ */
int main(void){
  float *buff, sample = 0.000001;
  int  bsize = 2, fsize = 32, i;

  /* 初期メモリ確保 */
  buff =(float*)malloc(sizeof(float)*bsize);
  if (buff == NULL) {
     printf( "error malloc\n" );
     exit(1);
  }

  /* 書込み */
  for(i=0; i<fsize; i++){
    if(bsize == i){
      bsize *= 2;
      buff =(float*)realloc(buff,sizeof(float)*bsize);
      if (buff == NULL) {
         printf( "error realloc %d\n",i);
         exit(1);
      }
      sample += sample;
     }
    buff[i] = sample;
    printf("%d:\t%f\n",i,buff[i]);
  }
  /* メモリ解放 */
  free(buff);
  return 0;
}
はじめ float 2つ分のメモリを確保し、for文でそのメモリに数値を入れていく。メモリが足りなくなったら、メモリを2倍にして対応する。さらに足りなくなったら、また2倍にする。これを繰り返して行く。Javaでは苦労したメモリの拡張がC言語では結構簡単に実現できてしまう。音加工では、よく使う処理なので、便利に思えた。ソースは、かなり自分勝手に書いているので間違っているかもしれない。とりあえず動いているというレベルです。
0:  0.000001
1:  0.000001
2:  0.000002
3:  0.000002
4:  0.000004
5:  0.000004
6:  0.000004
7:  0.000004
8:  0.000008
9:  0.000008
10: 0.000008
11: 0.000008
12: 0.000008
13: 0.000008
14: 0.000008
15: 0.000008
16: 0.000016
17: 0.000016
18: 0.000016
19: 0.000016
20: 0.000016
21: 0.000016
22: 0.000016
23: 0.000016
24: 0.000016
25: 0.000016
26: 0.000016
27: 0.000016
28: 0.000016
29: 0.000016
30: 0.000016
31: 0.000016


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら