- ベストアンサー
データ型charの buf[ ]で「[ ]」に可変の数値を入れたい
以下の質問にお答え願います。 「#define SUUJI1 123」で定義した時、 「char buf[SUUJI1];」の、「SUUJI1」は当然「123」であり、「char buf[123];」であることが言えます。 上記の例では、常に「SUUJI1」の値は「123」の固定であり、変わる事はありません。 では次の例で、SUUJI1の中味を場合によって可変にしたいのですが、例えば、「SUUJI1」の値を「123」ではなく、「777」にしたい時、int型「i」という変数を用いて、 「i = 777;」として、「char buf[i];」とした時、「error C2057: 定数式が必要です。」「error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。」とコンパイルエラーが出ました。 場合によって配列の数を変えたい時、どのようなやり方でプログラムを組めば良いのか教えて下さい。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Cコンパイラならmalloc(ライブラリはstdlib.h)で領域を確保、戻り値のポインタ(char*)を使用。 用済みになったらfreeで解放。 C++であれば new char[i + 1] で領域を確保、同じく戻り値のポインタ(char*)を使用。 用済みになったらdelete []で解放。 他の皆さんの言うとおり、単純な配列に対して、動的な領域変更は許可されません。 新しいサイズの領域を確保した後、古い領域を解放する必要があります。 #STLのvectorを使用する場合、便利なメソッドが多々用意されています。
その他の回答 (5)
- keyguy
- ベストアンサー率28% (135/469)
そのような用途に最近ではSTLが導入されました その中にvectorと呼ばれる要素数可変の配列があります C++の範囲で使うのがいいのですが Cの範囲でも使えます いまどきSTLを使わないでプログラムを作るのはアセンブラでプログラミングしているようなものです STLを使う事をお勧めします 無償Borland C++5.51(Cの範囲でも使用可)コンパイラでもSTLが使えます STLのvector,list,stringは使うのが楽しくなるぐらいに使いやすいものです 病み付きになります
- hpsk
- ベストアンサー率40% (48/119)
> 「可能なら gcc を使う」が答えかな. 細かいことですが、現在のgccは、デフォルトではC99対応でのコンパイルを行いません(まだ完全にC99に対応していないため)。"--std=c99"または"--std=gnu99"オプションをつける必要があります。 gccがデフォルトでも変数による配列サイズの指定が可能なのは、C99の仕様によるものではなく、GCC独自の拡張仕様によるものです。 話がそれてしまいましたが、現時点では配列サイズを動的に指定したい場合は、#1さんのおっしゃるようにmallocを使うのが妥当だと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
コンパイラを C99 に対応したものにすれば問題ないんですが.... 「可能なら gcc を使う」が答えかな.
Cでは配列の大きさを変えることは出来ません。 領域を動的に確保して、ポインタで制御することはできますが、それは配列とは別物です。
- nagare
- ベストアンサー率33% (280/831)
配列の個数が分からない場合は、macllocで確保した領域を使います 参考URLがちょうどcharなので分かると思います