• ベストアンサー

セグメントエラー

Cプログラムを実行した時に発生する、セグメントエラー は何が原因なのでしょうか? コンパイルはちゃんとととっているのに、 なぜエラーがでるのでしょうか? C言語の本を見たのですが、 のってません。 お願いします。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 「セグメントエラー」ってSegmentation Fault の事ですよね。 そうであれば、メモリのアクセス侵害です。 原因としては、 ・アクセスできない筈のアドレス (NULL アドレスとか) にアクセスした ・獲得したアドレスを越えてアクセスした。 ・初期化していないポインタ変数を使ってアクセスした。 と言う感じです。 ケースとしては少ないと思いますが、1つの変数 (領域) を複数の データ型でアクセスした場合に、起きる事があります。

amuro_78
質問者

お礼

ありがとうございます。アドレス関係の違反なのですか、 がんばって確認してみます。

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

その他の回答 (4)

  • TMINET
  • ベストアンサー率32% (45/140)
回答No.5

>ありがとうございます。 >NULLとは文字列の最後に入っているやつですね、 >絶対入れないといけないのですよね~? 文字列にかぎりませんよ。 ポインタなども使い回ししたりする場合はNULLで初期化すると良いです。 ポインタが開放したアドレスを覚えてたりして、そこにアクセスした瞬間コケるという事もあります。 基本的に確保した領域は何が入っているか分かりません、ですから初期化をお勧めしたのです。

amuro_78
質問者

お礼

ありがとうございます。 初期化は心がけます。

すると、全ての回答が全文表示されます。
  • fruipa
  • ベストアンサー率38% (14/36)
回答No.4

No1、No2の方が書いておられるように、原因は様々ですが、 ひとつ例をあげると、 char a[5]; char b[10];   と領域を定義して、 strcpy( a, b ); と記述した場合、構文は問題ありませんよね。 コンパイルエラーは出ません。 でもいざ実行した時、bの値が"abcd"であれば問題ありませんが、 "abcdefgh"だったらaの領域をオーバーしてしまいます。 こういう場合に、そういうエラーが起こる場合があります。 メモリ領域は実行時に割り当てられる為、 aの領域の後ろがたまたま書き込んではいけないようになっている場合は エラーが出ますし、書き込み可能の領域が割り振られている場合は、 何か別のデータを壊して上書きしてしまいます。 また、本を見られたようですが、この辺のことは言語というよりは、 OSの本のメモリ管理の説明のところに載っています。

amuro_78
質問者

お礼

ありがとうございます。 とてもくわしくて解かりやすかったです。

すると、全ての回答が全文表示されます。
  • TMINET
  • ベストアンサー率32% (45/140)
回答No.3

ソースを見ていないのではっきりしたことはいえませんが、 コーディング時に気を付けることは、使用する変数は「必ず初期化を行う」を習慣づけることです。 ポインタや配列などは怠りがちになってしまいますが是非やってください。 NULLクリアしてあげるだけでもかなり違うと思います。 現在のOSは皆マルチタスクですからC言語の場合メモリ管理はプログラマがしっかりやらねばなりません。

amuro_78
質問者

お礼

ありがとうございます。 NULLとは文字列の最後に入っているやつですね、 絶対入れないといけないのですよね~?

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

コンパイルは通りますが、実行時に発生するエラーですね。 配列を定義した大きさを超えて、データを書き込んでしまったり、 不正な値が入っている・あるいはアクセスしてはいけないアドレスが入っているポインタ変数を使って値を書き込んだりした時に発生します。

amuro_78
質問者

お礼

ありがとうございます。アドレス違反ですね、、、 よくみてみます。

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

関連するQ&A