• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のデバック 領域の二重解放が原因か??)

C言語のデバック 領域の二重解放が原因か??

このQ&Aのポイント
  • C言語でのデバック時にglibc detectedというエラーが出る。領域の二重解放が原因かどうかわからない。
  • 流体力学の研究でフリーの数値解析ソフトを使っているが、ポスト処理の機能が弱いため、C言語で自作している。
  • 翼周りの圧力分布を計算し、ある点の圧力の時間変化を知りたいため、プログラムを作成した。しかし、glibc detectedエラーが出る。

質問者が選んだベストアンサー

  • ベストアンサー
  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.5

/* ベクトルの領域確保 */ x = dvector(1,n); /* x[1...n] */ ここのコメントと、dvector の関数の実装は一致しています。 でも、 for( i = 0 ; i <= n ; i++) {  … input_vector2( x, t, i,fin, fout ); /* ベクトルxの入出力 */  … } と、iが0からnまで動くのに input_vector2関数内で、 void input_vector2( double *b, double t,int i ,FILE *fin, FILE *fout) {  …  fscanf(fin, "%lf", &b[i]);  … } と x[0...n] に対して代入が行われることになるのは、どうなのでしょうか?

ryutaitaro
質問者

お礼

その通りでした。 要素の始めが1からになるように設定しているのに、0から代入している点に間違いがあったようです。 ありがとうございました。

その他の回答 (4)

  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.4

char fn[5];/*圧力を指定するためのパス*/ … sprintf( fn,"./%5.4f/p",t); まずは、fn のバッファの長さを適切にしてみては? (最後のnull文字分も忘れずに!)

ryutaitaro
質問者

お礼

解答ありがとうございます。 明らかにおかしいですね。 fn[11]にすれば問題ないですよね?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>>なぜそこが二重解放になるのでしょうか? > >そのようなケースがありえるのかわかりませんが >nl1 が 0 のときには起こりえそうですよ。 すいません。勘違いでした。 なりませんね。 Valgrindで調べてみてはいかがでしょうか。

ryutaitaro
質問者

お礼

何度もありがとうございます。 私自身もfree_dmatrixなどはあまり分からずに使っているのですが、同じものを何度か使っていままでエラーがなかったのでたぶん問題はないだろうと思います。 既存の問題のないプログラムから変更した箇所はメイン関数の部分とinput_vectorだけなのでそのあたりのどこかがおかしいのだと思うんですが、わからないです。 Vargrindというデバックツール(?)があるんですね。 導入が私には難しそうなので、どうしようもなかったら使ってみようと思います。 ありがとうございました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>なぜそこが二重解放になるのでしょうか? そのようなケースがありえるのかわかりませんが nl1 が 0 のときには起こりえそうですよ。 余計なお世話なんでしょうが dmatrix, free_dmatrix は、無駄に難しい気がするので リファクタリングした方がいいと思います。

  • tda410
  • ベストアンサー率40% (2/5)
回答No.1

>実行ディレクトリ内には各時刻(以下のプログラム内では t)のディレクトリが存在し、その中に圧力(p)のデータが存在しています。 不具合が発生する状況が確認できないので、よくわかりません。 質問する場合は、問題が再現する状態をすべて提示してください。 とりあえずコードを見ましたが free_dmatrixの /* メモリの解放 */ for ( i = nr1 ; i <= nr2 ; i++) free((void *)(a[i]+nl1)); free((void *)(a+nr1)); ←ここ って二重解放になりそうですよ。

ryutaitaro
質問者

お礼

素早い解答どうもありがとうございます。 「問題が再現する状態」とは何なのかよくわからないですが、 「実行ディレクトリ内には各時刻(以下のプログラム内では t)のディレクトリが存在し、その中に圧力(p)のデータが存在しています。」の一文がよくわからなかったということですか?これなら大丈夫ですか?舌足らずですいません。 「プログラムを実行するディレクトリ内には各時刻(0.0001~0.0004 プログラム中では変数tで表しています)のディレクトリが存在し、その中に圧力(p)のデータが存在しています。」 なぜそこが二重解放になるのでしょうか?

関連するQ&A