
これはプログラム中のループ内です
=====================
m = IntArray(SIZE); //関数内でmallocを使用
…
puts("a"); //最後に'a'が表示されて終了
free(m);
puts("b");
=====================
プログラムを実行するとループ内でfree()関数を何度も通るのですが
途中でSegmentation faultが起きて停まります。
free()関数を取り除いても強制終了されます。
この現象の対処法をどなたか教えていただけないでしょうか?
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>ループを抜けた後
>free()関数の直前に解放する配列の中身を表示してみると異常はありませんでした。
配列の中身を見ても意味はありません。
異常は「配列の外」で起きています。
m[0]~m[SIZE-1]でもなく、tmp[0]~tmp[SIZE-1]でもない、不正なアドレスのメモリにデータを書き込んでいるので「freeした時に破綻」するのです。
この「不正なアドレスのメモリにデータを書き込んでいる」のは、mやtmpを介してアクセスした場合(例えば「tmp[i] = xx」とか「m[j] = xx」とかで、iやjが範囲外)はもちろんですが、全然違う方法でアクセスしている場合もあります。
例えば「strcpy(ptr,"~~~")」で、ptrが「未初期化で不定だった」とか。
なので「原因は確かにループの中にあったが、mにもtmpにも全然まったく関係無い場所だった」などと言う事も起きます。
繰り返しますが、異常は、m[0]~m[SIZE-1]でもなく、tmp[0]~tmp[SIZE-1]でもない、不正なアドレスのメモリにデータを書き込んでいるのが原因です。
いくら、配列mや配列tmpの中身を表示確認したって、何の意味もありません。「メモリが壊れてるのはソコじゃない」のですから。
No.5
- 回答日時:
回答#1の補足を見ずに回答してしまいましたが、
まず、原因と思われるのは、質問者さんのプログラムのうち省略されている
部分ではないかとも考えられます。
そういうこともあるので、
1)IntArray と malloc に置き換える。
2)省略せず、ループ部分はfor分だけとし、提示されたステートメント
以外は削除する。
というもので、同様の現象になるのか確認してみてはいかがでしょう?
結果
変更してみたら結果OKだった ---> 省略していた部分が原因
変更しても結果は同じ ---> たぶんmallocに関係した不具合
ですが、単純なプログラムなので再現確認は容易
になります。
回答して頂いた皆様ありがとうございました。
原因はmain()関数内で配列をコピーするときコピー元がNULLになっていたことでした。
お騒がせしてすみません。
No.3
- 回答日時:
で回答していますが、
「memory over commit」が原因の場合が考えられます。
違うOS上でテストしてみたらどうでしょうか。
上記のQ&Aでのサンプルプログラムでは、
Cygwin上では、強制終了しない。Linux上では強制終了する。
という結果になっていました。
No.1
- 回答日時:
>途中でSegmentation faultが起きて停まります。
>free()関数を取り除いても強制終了されます。
であれば、free()を疑うのではなく、そのほかの処理を疑うべき。
「Segmentation fault」はメモリ使用のミスで発生する可能性が高いエラー。
ループ条件のミスや、初期化されていない(不定値の入っている)文字列の利用など、
この回答への補足
回答していただいてありがとうございます。
プログラムを改良したところループを抜けた直後のfree()関数で
Segmentation faultが起きました。
上のプログラムに少し付け加えさせていただきますが、
tmp = IntArray(SIZE);
=====================ループ内
m = IntArray(SIZE); //関数内でmallocを使用
…
free(m);
=====================ループ終
for(i=0; i<SIZE; i++) printf("%d ", tmp[i]); //中身が異常なく表示される
puts("a"); //最後に'a'が表示されて終了
free(tmp);
puts("b");
ループを抜けた後
free()関数の直前に解放する配列の中身を表示してみると異常はありませんでした。
質問の内容が変わってしまい申し訳ありませんが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルVBA:変数の疑問?
-
エクセルでXY座標に並べられた...
-
複数のtextboxの処理を一括で行...
-
VBA 桁数が混在するソート
-
vba フィルター 複数条件 3つ以...
-
Redim とEraseの違いは?
-
Dir関数で読み取り順を操作でき...
-
VBA フォルダ内のファイルを、...
-
VBScriptでCSVファイルを読み出...
-
構造体配列内の文字列検索のよ...
-
VB6からの移行したいけど、VB.N...
-
ACCESSであえてデータを配列形...
-
VB.NETの配列の限界を教えてく...
-
データ数の多い構造体配列について
-
構造体配列の特定のメンバーをF...
-
COBOLの基本的な事なので...
-
GetOpenFilename(MultiSelect...
-
C++で作成したDLLにVBAから配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列のペースト出力結果の書式...
-
定数配列の書き方
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
複数のtextboxの処理を一括で行...
-
VB.NETの配列にExcelから読み込...
-
COBOLの基本的な事なので...
-
Excel2010のinputboxで複数デー...
-
VBAでMODE関数をつくる
-
レコードセットの中身を配列に...
-
ReDim PreserveよりもReDimが遅い
-
EXCELを使って、アクセスログを...
-
配列の中の最大値とそのインデ...
-
VB6のメモリ解放に関して
おすすめ情報