教えて! goo のコンテンツに対する取り組みについて

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

gooドクター

A 回答 (5件)

こんにちわ。



「セグメントエラー」ってSegmentation Fault の事ですよね。
そうであれば、メモリのアクセス侵害です。
原因としては、
・アクセスできない筈のアドレス (NULL アドレスとか) にアクセスした
・獲得したアドレスを越えてアクセスした。
・初期化していないポインタ変数を使ってアクセスした。
と言う感じです。

ケースとしては少ないと思いますが、1つの変数 (領域) を複数の
データ型でアクセスした場合に、起きる事があります。
    • good
    • 2
この回答へのお礼

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

お礼日時:2002/12/20 23:17

>ありがとうございます。


>NULLとは文字列の最後に入っているやつですね、
>絶対入れないといけないのですよね~?

文字列にかぎりませんよ。
ポインタなども使い回ししたりする場合はNULLで初期化すると良いです。
ポインタが開放したアドレスを覚えてたりして、そこにアクセスした瞬間コケるという事もあります。
基本的に確保した領域は何が入っているか分かりません、ですから初期化をお勧めしたのです。
    • good
    • 2
この回答へのお礼

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

お礼日時:2002/12/25 13:15

No1、No2の方が書いておられるように、原因は様々ですが、


ひとつ例をあげると、
char a[5];
char b[10];   と領域を定義して、
strcpy( a, b ); と記述した場合、構文は問題ありませんよね。
コンパイルエラーは出ません。

でもいざ実行した時、bの値が"abcd"であれば問題ありませんが、
"abcdefgh"だったらaの領域をオーバーしてしまいます。

こういう場合に、そういうエラーが起こる場合があります。
メモリ領域は実行時に割り当てられる為、
aの領域の後ろがたまたま書き込んではいけないようになっている場合は
エラーが出ますし、書き込み可能の領域が割り振られている場合は、
何か別のデータを壊して上書きしてしまいます。

また、本を見られたようですが、この辺のことは言語というよりは、
OSの本のメモリ管理の説明のところに載っています。
    • good
    • 2
この回答へのお礼

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

お礼日時:2003/01/04 20:45

ソースを見ていないのではっきりしたことはいえませんが、


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

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

お礼日時:2002/12/20 23:24

コンパイルは通りますが、実行時に発生するエラーですね。



配列を定義した大きさを超えて、データを書き込んでしまったり、
不正な値が入っている・あるいはアクセスしてはいけないアドレスが入っているポインタ変数を使って値を書き込んだりした時に発生します。
    • good
    • 1
この回答へのお礼

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

お礼日時:2002/12/20 22:42

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング