[871] Re:List 4-6
投稿者:(ぱ)
2007/02/20 02:13:25
>お世話になります。プログラミング初心者です。
>
>「ポインタ完全制覇」のp218のList 4-6のプログラムで質問させてください。
>
>76--79行目でmallocを使っているのは何故なのでしょうか。
>
>代わりに、
>
>return st_line_buffer;
>
>では駄目なのでしょうか。
マスタングさんが書いておられるように、この書き方では、2行目が読み込まれたときに1行目の領域が上書きされてしまいます。st_line_bufferが指す先の領域はひとつしかないからです。
ただし、たとえば以下のように書けば、
temp = st_line_buffer;
st_line_buffer = NULL;
st_current_buffer_size = NULL;
return temp;
次のread_line()の呼び出しでは新たな領域が割り当てられますから、正しく動作することでしょう。ただし、st_line_bufferはALLOC_SIZE(256バイト)ずつまとめて伸びていきますから、行の長さによってはメモリが無駄になります。
256バイトずつではなく、1バイトずつrealloc()していけばこの無駄はなくせますが、p.221で説明しているようにrealloc()はそれなりに重い関数なので、あまり頻繁にrealloc()しないため、こうしているわけです。
List 4-6では、以下の戦略をとっています。
(1)ファイルから文字を1文字ずつ読み込み、いったん「一時置き場」に蓄える。
(2)「一時置き場」はひとつしかない。
(3)行が「一時置き場」に入りきらない場合、「一時置き場」は256バイトを単位に
まとめて拡張される。一時置き場が縮むことはない。
(4)行を最後まで読み終わり、行の長さが確定した時点で、その行の長さに
ぴったり合わせたサイズの領域を新たに確保し、そこにコピーして、
利用者に返す。
たとえ話は好きじゃないですが、材木屋さんになったと想像してください。材木がコンベアーに(縦方向に)乗って流れてくるのですが、材木の長さはまちまちです。あなたはそれを箱詰めして発送しなければなりません。
コンベアーの端に広めの作業領域を作り、いったん材木をそこに置いて、正確な長さを測ってから、ぴったりの大きさの箱を作るという方法が無駄がないと思いませんか? このプログラムではそういう方針をとっているわけです。