起KはC言語が好きです。C++も好きだけど結局C言語が好きです。そのC言語ですが、不便なところが一つあります。それは配列の長さを容易には変更できないということです。いやreallocを使えば変更はできます。reallocはすごいです。reallocするとポインタが変わってしまいます(変わらないこともあるけど)。そりゃそうですよね、後ろに伸ばせなかったら別の場所に再確保するしかないです。当然なんだけど、でもオブジェクトの場所が変わっちゃうって、結構困るのです。この可変長配列上のある要素を指し示すポインタを作るとしたらどうしたらいいの?reallocするたびにポインタを全部更新する?えー、さすがにそれは大変すぎる・・・。いうことでこんなのを作りました。VA;このVA型のオブジェクトvaを作ってメモリのどこかにおいておきます。これで&vaの値さえわかれば、配列がどこにあるか確実にわかります。配列の何番目かを指し示したいのなら、何番目の要素なのかも持っておけばいいわけです。ポインタ一つと整数一つあれば、可変長配列上の任意の要素を示すことができるようになったのです。ここでは便宜上、VA型オブジェクトのポインタをpvaと呼ぶことにします。pvaに対して、サイズを変更せよというのはとても簡単です。n);みたいにすればいいのです。これでサイズが更新されます。n1を超えるようなら適当なマージンを付けてreallocもされます(それでrealloc回数を減らすようにしている)。reallocに失敗したらstderrにエラーを出力してexit(1)してくれるので、もはやサイズ変更が失敗するケースを想定する必要がありません。マージン付きの可変長をやめる関数も付けました。適切なサイズが確定したら呼び出して、マージン部分を解放させます。n);関数に配列を渡すときは、pを渡さずにpvaを渡すようにするのです。承この可変長配列ライブラリ(VA)は大成功で、すごく便利になりました。・・・今までのKのプログラミングスタイルは、とりあえず大きめの固定サイズでmallocして、それを超えたらエラー終了、というものがほとんどでした。これなら何も面倒なことはないわけです。メモリ効率は良くないです。・・・そのせいでメモリが少ない環境ではうまく動かなかったり、想定以上の入力が来てエラー終了してしまったりと、柔軟性には難がありました。それがVAを使うことで、すごくメモリ効率が良くなりました。プログラムでは、上限を超えていないかのチェック箇所をVA_sizeに置き換えている程度なので、大して複雑さは変わっていません。それでこんなによくなるなんて・・・。みたいにするのですが、これによって可変長配列に名前がつきます(つけたくなければ""でもいい)。n1を表示してくれる)。その時に名前も出るのです。このデバッグ機能が最高で、メモリリークとかも簡単に見つけられます。名前があるから、ああこいつがまだメモリに残っていたか、なんてわかっちゃうわけです。・・・Kはもはや生のmalloc/reallocを全く使わなくなって、全部VAで管理するようになってしまいました。可変長ではなくてもVAで管理できるので。VAはただの可変長配列です。線形リストでも木構造でもないです。配列の途中への高速な挿入・削除などの凝ったことはできません。配列ってちょっとしたことなら一通りできるので、よほど大規模なことをやらない限り、十分使用に耐えます。・・・今までデータ構造のライブラリはいくつか作って使っていましたが、「ああ、自分に必要なのはこういうシンプルなやつだったんだー」とつくづく思いました。転ところが・・・問題が発覚します。VAの中にVAを置いておくことができないのです。いや、おいてもいいのですが、サイズが変更されてポインタが変わってしまうと、pvaの値が変わってしまいます。これでは「pvaとiがあれば、VA上の任意の要素を指し示せる」が崩れてしまいます。何かの拍子にpvaが変わって有効じゃなくなるかもしれないからです。