• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Windowsでは出るエラーでMacでは出ない)

Windowsでエラーが起きる原因とは?

このQ&Aのポイント
  • Windowsではエラーが発生するが、Macでは正常に実行できる
  • エラーメッセージは"XXXXX.exe has triggered a breakpoint."で、VC++上の"malloc.c"タブが開く
  • WindowsとMacの環境の違いが原因でエラーが発生している可能性がある

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

  • ベストアンサー
回答No.3

>XXXXX.exe has triggered a breakpoint. 意味は「XXXXX.exeはブレークポイントで停止した」です。 malloc.cの所で出るとしたら「ヒープ領域を破壊している」と思います。 Visual C++ 2013の場合、ヒープ領域を破壊すると、mallocの内部で「ブレークポイントで例外停止」するようになっています。 んで dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N); は、明らかにおかしいです。 dcmplx型をN個分確保したいのに、double型をN個分しか確保してません。 正しくは dcmplx *Phi = (dcmplx*)malloc(sizeof(dcmplx)* N); じゃないかと思います。 あと、MacのXcodeでは、ヒープを破壊すると APPNAME_XXX(????,0x????????) malloc: *** error for object 0x????????: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug と言うエラーが出る筈だけど、Visual C++ 2013とは実装が異なるので、偶然「使ってないヒープ領域を壊しただけ」の場合は、エラーも出ないし、何も起きず、普通に「ちゃんと実行したフリ」をする筈です。 ヒープ領域は、壊し方によっては、Visual C++ 2013でも「エラーも出ないし、何も起きず、普通にちゃんと実行したフリをする」で終わるので、なかなかバグが見付からない場合もあります。

codingbeginner
質問者

お礼

おお、何という単純なミス(ただ、仕組みについては複雑?)だったんでしょう! メモリサイズを確保するために同じようにそれ以外の変数同様に行っていたため、コピーペーストで最後の部分だけ書き換え忘れたようです! 修正したら、正しく実行できました!ありがとうございます!

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

追記の追記。 mallocされたメモリが開放されないまま、次々に新しいメモリが確保されていき、使い終わったメモリが誰にも開放されないままプログラムが終了している(メモリリークしている)が、Nの最大値は1024くらいなので、ほぼ実害は無い。 doubleの値が数千個分メモリリークした所で今のOSは屁でもないので、ユーザーメモリがちょっと減ってオシマイになるだけ。 このプログラムを何千万回も動かすとか、ずっと常駐させて繰り返し動かすとかすれば、実害が出るだろうけど。

codingbeginner
質問者

お礼

他の方への質問の回答までありがとうございます!これくらいでは問題ないとのことで。 ただ、できるだけ解放する癖をつけておきます!

すると、全ての回答が全文表示されます。
回答No.4

追記。 scanf系関数について http://www.isc.meiji.ac.jp/~re00030/jse/scanf.html scanf系は 浮動小数点(次の3つは同じである) f 入力を浮動小数(float型)と解釈 e,E 入力を浮動小数(float型)と解釈 g,G 入力を浮動小数(float型)と解釈 オプション l long型の整数またはdouble型の浮動小数点を意味する(小文字のエル) って事になっている。 なので、%gって書いたら、floatのポインタが指定されているとして実行するんで、正しく代入されない。 doubleのポインタを指定する場合は、%lf、%le、%lE、%lg、%lGのどれかを指定すること。 「%gで良い」と言う回答は無視すること。

codingbeginner
質問者

お礼

ありがとうございます!分かって書いたつもりなのに指摘されるとそうなのかな?と思ってしまいました。 他の回答も順次チェックしてコメントしていきます。

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

とりあえず……malloc()して、そのあとどこで解放していますかね? >for (pow2 = 7; pow2 <= 10; ++pow2){ のループでそれぞれNはいくつになりますかね?

codingbeginner
質問者

お礼

malloc()と同じループの中に、 free(nu); free(Vp); free(chi); free(phi); free(Phi); を入れてみましたが、dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N)の部分をdoubleのままにしていたら今まで同様のエラーが出ました。dcmplxにしたら、freeをいれても実行できました。 この場合、このfreeは必要なんでしょうか?癖をつけておいた方がいいとか。また、書き方としてはこれで問題ないですよね?

すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8426/18047)
回答No.1

よく見る気はないけど,とりあえず fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2); これの%lgはC89やC++ではエラーじゃないのかなあ。C99では無視されるようだけど。 普通に%gにすればいいのに。

すると、全ての回答が全文表示されます。

専門家に質問してみよう