以下の質問にお答え願います。
「#define SUUJI1123」で定義した時、
「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 の配列を割当てまたは宣言しようとしました。」とコンパイルエラーが出ました。
場合によって配列の数を変えたい時、どのようなやり方でプログラムを組めば良いのか教えて下さい。
No.6ベストアンサー
- 回答日時:
Cコンパイラならmalloc(ライブラリはstdlib.h)で領域を確保、戻り値のポインタ(char*)を使用。
用済みになったらfreeで解放。
C++であれば new char[i + 1] で領域を確保、同じく戻り値のポインタ(char*)を使用。
用済みになったらdelete []で解放。
他の皆さんの言うとおり、単純な配列に対して、動的な領域変更は許可されません。
新しいサイズの領域を確保した後、古い領域を解放する必要があります。
#STLのvectorを使用する場合、便利なメソッドが多々用意されています。
参考URL:http://www.cprogramming.com/tutorial/stl/vector. …
No.5
- 回答日時:
そのような用途に最近ではSTLが導入されました
その中にvectorと呼ばれる要素数可変の配列があります
C++の範囲で使うのがいいのですが
Cの範囲でも使えます
いまどきSTLを使わないでプログラムを作るのはアセンブラでプログラミングしているようなものです
STLを使う事をお勧めします
無償Borland C++5.51(Cの範囲でも使用可)コンパイラでもSTLが使えます
STLのvector,list,stringは使うのが楽しくなるぐらいに使いやすいものです
病み付きになります
No.4
- 回答日時:
> 「可能なら gcc を使う」が答えかな.
細かいことですが、現在のgccは、デフォルトではC99対応でのコンパイルを行いません(まだ完全にC99に対応していないため)。"--std=c99"または"--std=gnu99"オプションをつける必要があります。
gccがデフォルトでも変数による配列サイズの指定が可能なのは、C99の仕様によるものではなく、GCC独自の拡張仕様によるものです。
話がそれてしまいましたが、現時点では配列サイズを動的に指定したい場合は、#1さんのおっしゃるようにmallocを使うのが妥当だと思います。
No.1
- 回答日時:
配列の個数が分からない場合は、macllocで確保した領域を使います
参考URLがちょうどcharなので分かると思います
参考URL:http://www9.plala.or.jp/sgwr-t/lib/malloc.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- C言語・C++・C# C言語のバイナリファイルに関する質問 8 2022/06/24 07:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) findメソッドの変数について 6 2023/06/23 08:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使わずに、変数名を動的...
-
C言語 配列の長さの上限
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
VBで構造体の配列を関数に渡す...
-
C# Listを使わずに2次元配列の...
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
C言語で特定列だけを抽出して配...
-
VBで動的なメモリの確保
-
複数の選択範囲の行番号を個別...
-
ExcelVBAで質問です。離れた二...
-
unsigned char配列への入力の仕方
-
アルファベットの配列を数字の...
-
RGB値を画像(PNG・BMPJPEGなど)...
-
配列の参照渡しで型が一致しま...
-
配列内の文字間を排他的論理和...
-
Redimした動的配列はEraseする...
-
ポインタの配列のコンマについて
-
C言語でのカンマ区切りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列の参照渡しで型が一致しま...
-
配列を使わずに、変数名を動的...
-
VBで構造体の配列を関数に渡す...
-
配列で格納したものをmsgboxで...
-
unsigned char配列への入力の仕方
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
-
パイソンの
-
C言語初心者 ポインタについて...
-
ExcelVBAで質問です。離れた二...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
-
Functionの戻り値を2次元配列...
-
C++ vectorに配列をプッシュしたい
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
Redimした動的配列はEraseする...
おすすめ情報