- ベストアンサー
malloc呼び出し時のセグメンテーションフォルト
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そのようなケースでは、既にその malloc 以前のコードでメモリが 破壊されている事が多いです。 例えば、こんなミスが有るとメモリやスタック等が壊れる可能性大。 ・不正なアドレスを解放している、または多重解放している ・バッファ(配列)のオーバーまたはアンダー ・printf や scanf で型指定と引数型が合っていない 例)printf("%s", int値); ・printf や scanf 等の可変引数呼出で引数の数が合っていない 例)printf("%d %d", int値); また、malloc で要求したメモリ量が確保出来なかった場合に、メモリ 不足のエラーではなくセグメンテーションフォルトやアクセス違反等の エラーが発生した事も有りました。
その他の回答 (2)
- BILLY-J
- ベストアンサー率57% (60/105)
#1です。 >バッファのアンダーとはどの様な時に発生するのですか? 例えば配列をインデックス値ではなくポインタの加減算で参照 している時、更には後方検索などで最後尾から先頭に向かって ループさせるようなロジックで起こり得ます。 インデックス値がゼロを通り越してマイナスになってしまう ようなイメージです。
お礼
質問への回答ありがとうございます。 なるほど、配列の先頭より前を見てしまうような場合ですね。 アンダーという言葉からイメージが湧かなくて。。。お手数おかけしました。 まだまだ、解決の糸口が見つからないのですが頑張りますね。
- angband
- ベストアンサー率51% (86/168)
malloc自体が問題の場合はdmallocというライブラリが あります。これはmallocをリプレースして、各種検査が 可能になります。HP-UXでも使えます。 http://dmalloc.com/ mallocする前に壊れている場合は、デバッグはマジで 大変なものの1つだと思います(規模にもよりますが)。 ポインタ周りであれば、僕はCのプログラムでもとりあえず モジュールごとにclassで囲んでC++コンパイラでリンク してみます。クラスにしてみるとどのコードがだめなのか 判定できますし、コードを1行づつ追うのは精神衛生上 よくないでしょうしね・・
- 参考URL:
- http://dmalloc.com/
お礼
回答ありがとうございます。 頑張ってdmallocを利用してみます。 angbandさんはC++コンパイラでリンクしてみるとのことですが、C++に手をつけたことのない身としてはそちらの手段は目下の所無理そうです。 教えていただいたことは、もう少し余裕のあるときに試してみますね。
関連するQ&A
- セグメンテーション・フォールト
UNIXで、CよりOracleのSQL*Loaderを使用しています。 CSVファイル->Oracleのテーブル でデータを挿入する際に、テーブルのカラムサイズが 足りずにエラーが発生し、最大エラー件数を超えたので 処理がエラーで終了しました。 その際に、 セグメンテーション・フォールト(coredump) というメッセージが表示されます。 ついでに補足するならば、Cのプログラムを直接起動すると、 上記エラーメッセージ出力後、プロセスは終了しますが、 別プログラムより起動した場合(UID=root)、 プロセスが終了してくれません。 上記メッセージの意味と、なぜrootからだと プロセスが終了しないのか、が分かりません。 どなたかお分かりになる方、よろしくお願いします。
- ベストアンサー
- その他(OS)
- セグメンテーションフォルトが起きます。
gccでセグメンテーションフォルトが起きます。 gdbでデバッグしたのですがどうもSTLのコードでセグメンテーションフォルトがおきているようなのです。 そんなことってあるのでしょうか。 何かわかる方アドバイスお願いします。 以下はgdbで実行した結果です。 Program received signal SIGSEGV, Segmentation fault. CNFLiteral::CNFLiteral (this=0x16eec0, cnf=@0x16ef80) at /usr/include/c++/3.3.3/bits/stl_iterator.h:642 642 base() const { return _M_current; }
- ベストアンサー
- C・C++・C#
- セグメンテーション違反とmalloc
char *name この宣言でプログラムの組初めはこれでいけたのですが char *name = (char *)malloc(sizeof(char) * 10); 後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。 なぜこうなるのでしょうか? それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?
- ベストアンサー
- C・C++・C#
- HP-UXへの移植でセグメンテーション障害が発生し、困っています
HP-UXへの移植で困っています。 strcpy(Month->Data,Data.arr); というコードがあり、今まではDigital Unix上では正常に動作していました。しかしHP-UX上でコンパイル、実行するとセグメンテーション障害が発生し、正常に動作しません。 どなたか助けてください。
- ベストアンサー
- C・C++・C#
- セグメンテーション違反とは??
linuxでC言語のプログラムを構築しています。 gccでコンパイルしたときにセグメンテーション違反という エラーが出てしまいます。 セグメンテーション違反とは一体なんの ことなんでしょうか? メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので わかりやすく教えて頂けるとありがたいです。
- ベストアンサー
- C・C++・C#
- mallocについて
mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。
- ベストアンサー
- C・C++・C#
- セグメンテーション違反について
C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。
- ベストアンサー
- C・C++・C#
- malloc.cを見たい
TurboLinux10でとあるプログラムを実行していましたが、 coreファイルを吐き出してGUIが終了してしまうことがあります。 gdb -c core.**** 実行ファイル名 というコマンドでGUIが終了した原因を調べたところ、 kernel/malloc.c:3415 kernel/malloc.c そのようなファイルやディレクトリは見つかりません。 と出ていました。 malloc.cというソースファイルを見たいのですが、 どこから入手すればよいでしょうか。 TurboLinux10は「全パッケージ」を選択してインストールしており、 カーネル再構築もできるのでカーネルのソースファイルは入っているはずですが、 最低3415行もあるmalloc.cは存在しません(十数行の同名ファイルはありました)。 TurboLinux10DesktopのソースファイルをFTPサーバーからダウンロードしようと、 ftp://ftp.turbolinux.co.jp/pub/TurboLinux/TurboLinux/ia32/Desktop/10/source/SRPMS/ に行ってみたのですが、 勿論malloc.cが入っていそうなパッケージがわかりません。 (そもそも、「malloc.cが見つからない」と出た場合にmalloc.cを入手してくるべきなのでしょうか)
- ベストアンサー
- Linux系OS
- セグメンテーション違反について
現在、FORTRANを使ってプログラミングを行っています。 プログラムを作って、コンパイルまではうまくいき、いざファイルを実行してみると、「セグメンテーション違反です」という文字が出てしまいました。 いったい何が原因でそのような現象が起こってしまったのでしょうか。 ご教授願えればと思います。
- 締切済み
- その他(プログラミング・開発)
- なぜセグメンテーション違反??
こんにちは。ちょっとお聞きしたいのですが、、、 友達が作ったプログラムを私のディレクトリにコピーして実行しようとしたら「セグメンテーション違反です」と表示されます。 友達のログインしたPCではうまく作動するのですが・・・。 こんなことってあるのでしょうか? 違うディレクトリにコピーしたことが原因なのでしょうかねぇ?? わかる方おられましたら、教えていただきたいです!!
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございました。 指摘された点を地道に追ってみます。 回答に対する質問なんですが。。。 バッファのアンダーとはどの様な時に発生するのですか?