
No.4ベストアンサー
- 回答日時:
>個人的には、メモリーがオーバーフローした、free()のやり方を間違えた。
mallocの使い方を間違えた、のうちのどれかが原因だと思っているのですが個人的には、これら以外にも(mallocとは無関係に)
プログラムが、確保した領域外をアクセスした
という可能性もありますよ。
アクセスした領域外がたまたま、malloc 等で用いる『管理情報』であり、
7回目のmalloc実行時にエラーが起きたのでは?
ありがとうございます。
結局別のところのmallocが自分のイメージしていたものより小さい領域しか確保していなかったのが原因っぽいです。ありがとうございました
No.6
- 回答日時:
>メモリーがオーバーフローした、
>free()のやり方を間違えた。
>mallocの使い方を間違えた、のうちのどれか
領域外アクセスで malloc が落ちるのは珍しくないです。
mallocの実装によりますが、
malloc で確保したメモリブロックは、その前後に
そのブロックの管理領域を持ってることが多く
それに誤って書き込むと malloc が発狂します。
No.5
- 回答日時:
こういうツールを使ってデバッグすると良いと思います。
https://ja.wikipedia.org/wiki/Valgrind
当然ですが、例外が発生したところが原因じゃ無くて、そのずっと前にバグがあります。
> メモリーがオーバーフローした、free()のやり方を間違えた。mallocの使い方を間違えた、のうちのどれかが原因
「メモリーがオーバーフロー」が文字通りの意味だとすると、メモリが足りなくなることで今回は関係ないです。あるいは添え字の範囲オーバーのことですかね?
原因として考えられるのは、
・配列の添え字範囲オーバー
・ポインターの使い方がおかしい
・malloc/freeの間違い
・変数宣言の型がおかしい
あたりでしょうか。
実行せずに、静的にデバッグするには、自信なく書いた部分を徹底的に見直すか。
No.3
- 回答日時:
「malloc 等で用いる『管理情報』をあやまってぶち壊す」というケースも考えられるので, そういうチェックも必要かもしれない.
最悪は「実はハードウェアの障害」ということもありえなくはないけど, そうなるともうどうしようもないね. 「別の機械で動かしてみる」くらい.
No.2
- 回答日時:
「本当に問題がある」ときには, 非常にチェックがしにくくなるんだよな.... とりあえず
・malloc と free の回数
・free する値が「正当」かどうか
を確認する, くらいかなぁ. ちなみにそこに補足してある程度では何もわからない.
あ, free で引数をキャストするのはやめた方がいいよ. 特にその補足にあるようなキャストは完全に無意味だし.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
教えて!gooグレードポイントがdポイントに変わります!
dアカウント連携を行っていただくと、グレードに応じて「dポイント」が進呈されるようになります。
-
c言語の本を教えてください。分厚くて辞書みたいなやつがいいです。日本の本屋さんで変える、のにしくださ
C言語・C++・C#
-
c言語 配列から数字だけをint型として抜き取りたい
C言語・C++・C#
-
c言語の配列について
C言語・C++・C#
-
4
ソースコード1これを実行するとエラーがでます。おしえてください
C言語・C++・C#
-
5
カラーキューブ数独をc言語でときたいです。
C言語・C++・C#
-
6
C言語について。
C言語・C++・C#
-
7
C言語について。
C言語・C++・C#
-
8
たとえば、s = Tokyo Kyoto という文字列で s2 = s.split() しますと、s
C言語・C++・C#
-
9
構造体のポインタを引数に取る関数
C言語・C++・C#
-
10
プログラミングについて。
C言語・C++・C#
-
11
C言語 ループ中からの関数の呼び出し方のコーディング
C言語・C++・C#
-
12
これの答えは5になるとおもいます。
C言語・C++・C#
-
13
C言語 和文と英文のメッセージの出し方について
C言語・C++・C#
-
14
ルーチンとライブラリについて。
C言語・C++・C#
-
15
ルーチンとライブラリについて。
C言語・C++・C#
-
16
ペントミノをc言語で実行するとエラーがでる
C言語・C++・C#
-
17
論理演算子を判定するプログラム c言語で
C言語・C++・C#
-
18
C言語 putchar関数
C言語・C++・C#
-
19
C言語について。
C言語・C++・C#
-
20
なぜ高速フーリエ変換は画像のような単純な式なのにこちらのサイト書いてあるプログラムは長文で複雑なので
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
C言語に関する質問
-
5
アンマネージド関数でのメモリ...
-
6
クリッカブルMAP領域が分かる様...
-
7
構造体でchar name[]と*nameの...
-
8
GlobalAlloc について
-
9
HEAP に関すること
-
10
void*型のデータサイズ
-
11
C言語の質問です。 以下の命令...
-
12
C++ 構造体のnew
-
13
stringの最大サイズ
-
14
ヒープメモリの解放について
-
15
64ビットと32ビットの違い
-
16
allocってなんですか?
-
17
行列内の行の交換,列の交換を...
-
18
reallocの断片化対策について
-
19
入れ子になった構造体について
-
20
配列の添え字の最大数とは?
おすすめ情報
公式facebook
公式twitter
ちなみにmallocは
int* a =NULL;
a =(int*) malloc((n+1)*sizeof(int));
みたいにしていて
freeは
free((int*)a);
としています。
nは関数の引数でエラーで停止したときは4が入っていました。
malloc(int i)値とは何でしょうか?
7回目のmalloc実行時にエラーが起きました、その時20*sizeof(int)の領域を確保しようとしました。合計では973*sizeof(int)の領域を確保していました。 その時freeは1回しか実行されていませんでしたがプログラムの途中でのエラーなのでこれは問題ない気がします。
free する値が「正当」かどうかは一応変数名にスペルミスがないかは確認しました。