- ベストアンサー
C言語の領域確保について
- C言語を始めたばかりのものです。配列を計算させようとするプログラムで、配列の領域確保がうまくいかない問題が発生しています。領域確保の方法や失敗の原因について教えてください。
- また、csvからの値の取得やfgetsのライン数の値についても正しい方法を知りたいです。
- 最終的には500行2048列の計算を行う必要があるので、効率的な方法についてもアドバイスが欲しいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
buffもarvも「ファイルの中で、最も長い行の文字数+α」で良い。 例えば、最長の行が「先頭から改行まで、トータルで5329文字、改行も入れると5330文字」と言うのであれば、+αして、5400バイトあれば問題無い。 >最終的には500行2048列の計算をしないといけないので 2048列で、1つの列にある「数値」は「最大桁数」が決まっている筈。 例えば、最大桁数が50桁なら、1行の最大文字数は「50×2048+2047+1=104448」と計算できる(「2047」は「,」の分、「1」は改行の分) 安全の為に「+α」して、104500バイトのbuffを用意すれば良い。 arvの最大必要バイト数も、同じように計算が可能。 >できたらmallocを使えたらよいと思っています。 char buff[100000];//←問題の部分 を char *buff; buff=malloc(100000); if (buff == NULL) { abort(); return; } に変えるだけだ。 もし、計算で求めた「1行の最大バイト数+α」が「104500」になったのなら、100000を104500に変えれば良い。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず, プログラムには動作を説明するコメントを入れてください. もちろん自分だけで使うプログラムならコメントを書こうと書くまいと私の知ったことではありませんが, 他人に見せるプログラムにはある程度の処理のまとまりごとに「そこで何をしているのか (あるいは何をしたいのか)」をコメントで入れてください. 特にここでは他人に「見てもらう」プログラムなのだから, そのくらいの手間は惜しまないでください. あと, 「失敗する」というのが何を意味するのかが分かりません. あなたのいう「失敗」とは, 具体的にはどういうことなのですか? 「fgetsのライン数の値も正しくするにはどうすればよいのでしょうか」は意味不明. 「fgets のライン数の値」ってなんですか?
お礼
説明不足で失礼しました.失敗に関しては,VisualStdioごと停止していました.またfgetsは1ライン(行)で文字列を受け取るバイト数のことですが,chie65535さんのおかげで解決しました.回答ありがとうございます.
お礼
なるほど,桁数も考慮して確保する領域を決めるのですね.csvに関する疑問が多く困っていたのですが,これでかなり解消されました.丁寧に説明していただきありがとうございます!