アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語で書いたコードがうまく動かなくてVScodeでデバッグしたところ 何回目かに呼び出したmallocで止まっていました。エラー内容は
例外が発生しました
Unknown signal
となっており役に立たなさそうで、個人的には、メモリーがオーバーフローした、free()のやり方を間違えた。mallocの使い方を間違えた、のうちのどれかが原因だと思っているのですが調べ方がわかりません。うまい確認の仕方があれば教えてください。
また、何か考えられるほかの原因もあれば教えてください。

質問者からの補足コメント

  • ちなみにmallocは
    int* a =NULL;
    a =(int*) malloc((n+1)*sizeof(int));
    みたいにしていて
    freeは
    free((int*)a);
    としています。
    nは関数の引数でエラーで停止したときは4が入っていました。

      補足日時:2021/12/06 20:31
  • malloc(int i)値とは何でしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/12/06 22:15
  • 7回目のmalloc実行時にエラーが起きました、その時20*sizeof(int)の領域を確保しようとしました。合計では973*sizeof(int)の領域を確保していました。  その時freeは1回しか実行されていませんでしたがプログラムの途中でのエラーなのでこれは問題ない気がします。
    free する値が「正当」かどうかは一応変数名にスペルミスがないかは確認しました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/12/06 22:59

A 回答 (6件)

>個人的には、メモリーがオーバーフローした、free()のやり方を間違えた。

mallocの使い方を間違えた、のうちのどれかが原因だと思っているのですが

個人的には、これら以外にも(mallocとは無関係に)
 プログラムが、確保した領域外をアクセスした
という可能性もありますよ。

アクセスした領域外がたまたま、malloc 等で用いる『管理情報』であり、
7回目のmalloc実行時にエラーが起きたのでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。
結局別のところのmallocが自分のイメージしていたものより小さい領域しか確保していなかったのが原因っぽいです。ありがとうございました

お礼日時:2021/12/08 20:43

>メモリーがオーバーフローした、


>free()のやり方を間違えた。
>mallocの使い方を間違えた、のうちのどれか

領域外アクセスで malloc が落ちるのは珍しくないです。

mallocの実装によりますが、
malloc で確保したメモリブロックは、その前後に
そのブロックの管理領域を持ってることが多く
それに誤って書き込むと malloc が発狂します。
    • good
    • 0

こういうツールを使ってデバッグすると良いと思います。


https://ja.wikipedia.org/wiki/Valgrind

当然ですが、例外が発生したところが原因じゃ無くて、そのずっと前にバグがあります。

> メモリーがオーバーフローした、free()のやり方を間違えた。mallocの使い方を間違えた、のうちのどれかが原因

「メモリーがオーバーフロー」が文字通りの意味だとすると、メモリが足りなくなることで今回は関係ないです。あるいは添え字の範囲オーバーのことですかね?

原因として考えられるのは、
・配列の添え字範囲オーバー
・ポインターの使い方がおかしい
・malloc/freeの間違い
・変数宣言の型がおかしい
あたりでしょうか。

実行せずに、静的にデバッグするには、自信なく書いた部分を徹底的に見直すか。
    • good
    • 0

「malloc 等で用いる『管理情報』をあやまってぶち壊す」というケースも考えられるので, そういうチェックも必要かもしれない.



最悪は「実はハードウェアの障害」ということもありえなくはないけど, そうなるともうどうしようもないね. 「別の機械で動かしてみる」くらい.
    • good
    • 0

「本当に問題がある」ときには, 非常にチェックがしにくくなるんだよな.... とりあえず


・malloc と free の回数
・free する値が「正当」かどうか
を確認する, くらいかなぁ. ちなみにそこに補足してある程度では何もわからない.

あ, free で引数をキャストするのはやめた方がいいよ. 特にその補足にあるようなキャストは完全に無意味だし.
この回答への補足あり
    • good
    • 0

malloc(int i)値はどうしましたか。

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!