21.1 メモリ

一般に、少し大規模な、あるいはフレキシブルなプログラムにおいては扱う データは不定量になる場合が多い。別の言い方をすれば、あらかじめどれだけの メモリを必要とするかが分からないと言ってもよい。このことは、配列を用いた プログラミングでは対応できないような問題が存在することを示している。 勿論、メモリの必要量が分からないからと言って、無尽蔵にメモリを必要とする 問題が実際にコンピュータ上で実行出来る訳ではない。何故ならば、全ての 資源は有限であるからである。従って、十分な予測が可能であるならば、 配列を用いてもプログラム可能であるとも言えるが、一般にはそうした予測が 困難である場合が多く、また、十分な大きさの配列を取ることは資源の無駄づかい にもなる。それ故に、ここで問題となっているのは必要な量のメモリをそれが 必要とされる時に用意するということなのである。

例として、ユーザーから入力された複数行の入力を保存することを考えてみよう。 まず最初に gets()で読み込むために適当な大きさの配列を取ることに する。

    char buf[512];
    ...
    while( gets(buf)!=NULL ){
        ...

ここでは一行は512文字までであると仮定しているが心配ならばそれ以上に しても良い。さて、問題は、次々とユーザーが入力した文字列を失わずに 保持するためには、buf[]に格納されたデータを別の場所にコピーして 保存しなければならない。しかし、buf[]に用意したのと同じように 512の大きさの配列を別に用意するのは、前述したようにメモリの無駄となる。 実際、ユーザーは一行に1文字しか入力しないかも知れないからである。 従って、ユーザーが入力しただけの文字数分のメモリを用意出来れば良い。 この場合のプログラムは次のようになるだろう。

    char buf[512];
    ...
    while( gets(buf)!=NULL ){
        /* buf[] の文字数を数える。仮にNとする */
        /* N+1 の大きさのメモリを用意する */
        /* 用意したメモリに buf[] の中身をコピーする */

ここで、N+1 としているのは、文字列の終わりの \0を 勘定に入れているためである。

次の節ではまずこのメモリを確保する方法について学ぶ。



最初のページ 戻る 次へ 最後のページ 目次
Hiroyasu Asami