malloc()でのメモリ確保が上手くいかない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

malloc()でのメモリ確保が上手くいかない

#1

投稿記事 by wasawasa » 10年前

こんにちは、何度もお世話になっております。
学校の課題である行列計算を行うプログラムの提示を求められたため、以下に添付したプロジェクトを作ったのですが、GaussEliminationSet.cpp
の50行目で double *w に malloc() でメモリを確保するのが上手くいかないらしく、同ファイルの52行目でアクセス違反が起きてしまいます。
一体何故 double *w へのメモリの確保が上手くいかないのでしょうか?どなたかよろしくお願いします。
添付ファイル
数値解析課題.zip
(820.61 KiB) ダウンロード数: 135 回

box
記事: 2002
登録日時: 14年前

Re: malloc()でのメモリ確保が上手くいかない

#2

投稿記事 by box » 10年前

CPals.Plane
の値が正しくない、とか…。

ところで、どうでもいい話ですが、
roop
って何でしょうか。
loop
の間違い?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: malloc()でのメモリ確保が上手くいかない

#3

投稿記事 by みけCAT » 10年前

自分の環境(GCC 4.8.1)で実行した所、
wasawasa さんが書きました:GaussEliminationSet.cpp
の50行目で double *w に malloc() でメモリを確保するのが上手くいかないらしく、同ファイルの52行目でアクセス違反が起きてしまいます。
という現象は再現できず、
main関数の62行目で呼び出しているStrReg関数において、NewStrに0が渡されており、19行目のstrlenでアクセス違反が起きてしまいました。

GaussEliminationSet.cppのComparePivotYN関数において、SinResultを更新する処理が無く、
102行目でSinResult.buff=NULL;と初期化したものがそのまま渡っていると思います。
StrReg関数の引数CalStrは値渡しではなく、参照渡しにすることを想定しているのではないでしょうか?

見るプログラムが間違っていたらすみません。

【編集】17:50 プロジェクトファイルが入っていなかったのでファイルを差し替えました
添付ファイル
yakobihou.zip
ビルドしたプログラムとバイナリ
(134.72 KiB) ダウンロード数: 118 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: malloc()でのメモリ確保が上手くいかない

#4

投稿記事 by wasawasa » 10年前

みけCATさんのご指摘を受けて添付ファイルを確認してみたところ、ファイルを整理する過程でおかしな事になってたみたいです。
添付したファイルにわざわざ手を加えて貰っておいて難ですが、修正したファイルを貼り直しておきます。
お手数をおかけして申し訳ございませんが改めてよろしくお願いします。
添付ファイル
数値解析課題_修正.zip
(974.39 KiB) ダウンロード数: 120 回

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: malloc()でのメモリ確保が上手くいかない

#5

投稿記事 by みけCAT » 10年前

同じ場所でアクセス違反が発生しました。
タイムスタンプの目視、及びdiffを用いて調べてみましたが、ソースコードに最初のファイルとの違いは発見できませんでした。
添付ファイル
diff.txt
diffの出力(パスのShift_JISと中身のUTF-8が混ざっているので文字化けしています)
(3.06 KiB) ダウンロード数: 122 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ryo

Re: malloc()でのメモリ確保が上手くいかない

#6

投稿記事 by Ryo » 10年前

修正版を試したところ、私の環境でも再現できました
mallocをnewにしても破壊されたので、どっかでメモリぶっ壊してるのではと探ってみたのですが

GaussEliminationSet.cpp:ComparePivotYN()内にて
102行目でSinResultの中身が初期化された状態のまま
118行目で呼び出しているStrReg()に引き渡し、その先でメモリぶっ壊しているようです。

118行目をコメントアウトしたら通りました。

同じ結果になるとは限りませんが、参考に。

wasawasa
記事: 94
登録日時: 11年前

Re: malloc()でのメモリ確保が上手くいかない

#7

投稿記事 by wasawasa » 10年前

お返事が遅くなりましたが、お陰様でメモリを確保できなくなる問題を解決した上で提出できました。
修正内容としてはStrReg()の構造に問題があったため、そちらを書き直して解決できました。
ありがとうございます。
添付ファイル
数値解析課題1.zip
(1.03 MiB) ダウンロード数: 132 回

閉鎖

“C言語何でも質問掲示板” へ戻る