malloc,free


目次に戻る


この二つの関数はメモリを動的確保、解放するもので、データの大きさが決まっていなか ったり、データのサイズが可変長な場合に使用します。というか、使用しないとそういった プログラムが作れない。
 
基本的な使い方は
char *buff;
buff = (char*)malloc( sizeof(char) * 100 );    /* char型のデータ が100個入る分だけメモリを確保 */
if( buff == NULL ){
    /* メモリ確保失敗 */
}
    :
    :
    :
free( buff);    /* 確保したメモリを解放する */
とすればよい。
mallocで確保したメモリ領域は、普段使う配列変数やポインタを使った方法で利用で きるが注意点がある。それは、free関数に渡す値はmallocが返す戻り値をそのまま渡さ なければいけない。ということだ。
 
次に、コンパイルは正常に終了するが、実行時にエラー(見た目には正常に終わるO Sもあるが、実際はエラーが発生している)が起きる例を書く。
char *buff;
int i;
buff = (char*)malloc( sizeof( char ) * 100 );

for( i=0 ; i<100 ; i++ ){
    *buff = '0';
    buff++;
}

free( buff );

上の例では、buffに代入されたmallocで得た戻り値の値を buff++ の部分で変更してしま っているからだ。buffの値を変更する分にはかまわないが、freeに渡す前に元の値に戻 す必要がある。ただ、一度変更したポインタを後で元に戻すのは面倒くさいので、たいて いは別のポインタ変数にアドレスを代入しmallocが返した戻り値は直接いじくらないように します。
char *buff,*work;
int i;

buff = (char*)malloc( sizeof( char ) * 100 );
work = buff;

for( i=0 ; i<100 ; i++ ){
    *work = '0';
    work++;
}

free( buff );

 
明日はrealloc関数を紹介します。


目次に戻る