- ベストアンサー
セグメントエラー
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 「セグメントエラー」ってSegmentation Fault の事ですよね。 そうであれば、メモリのアクセス侵害です。 原因としては、 ・アクセスできない筈のアドレス (NULL アドレスとか) にアクセスした ・獲得したアドレスを越えてアクセスした。 ・初期化していないポインタ変数を使ってアクセスした。 と言う感じです。 ケースとしては少ないと思いますが、1つの変数 (領域) を複数の データ型でアクセスした場合に、起きる事があります。
その他の回答 (4)
- TMINET
- ベストアンサー率32% (45/140)
>ありがとうございます。 >NULLとは文字列の最後に入っているやつですね、 >絶対入れないといけないのですよね~? 文字列にかぎりませんよ。 ポインタなども使い回ししたりする場合はNULLで初期化すると良いです。 ポインタが開放したアドレスを覚えてたりして、そこにアクセスした瞬間コケるという事もあります。 基本的に確保した領域は何が入っているか分かりません、ですから初期化をお勧めしたのです。
お礼
ありがとうございます。 初期化は心がけます。
- fruipa
- ベストアンサー率38% (14/36)
No1、No2の方が書いておられるように、原因は様々ですが、 ひとつ例をあげると、 char a[5]; char b[10]; と領域を定義して、 strcpy( a, b ); と記述した場合、構文は問題ありませんよね。 コンパイルエラーは出ません。 でもいざ実行した時、bの値が"abcd"であれば問題ありませんが、 "abcdefgh"だったらaの領域をオーバーしてしまいます。 こういう場合に、そういうエラーが起こる場合があります。 メモリ領域は実行時に割り当てられる為、 aの領域の後ろがたまたま書き込んではいけないようになっている場合は エラーが出ますし、書き込み可能の領域が割り振られている場合は、 何か別のデータを壊して上書きしてしまいます。 また、本を見られたようですが、この辺のことは言語というよりは、 OSの本のメモリ管理の説明のところに載っています。
お礼
ありがとうございます。 とてもくわしくて解かりやすかったです。
- TMINET
- ベストアンサー率32% (45/140)
ソースを見ていないのではっきりしたことはいえませんが、 コーディング時に気を付けることは、使用する変数は「必ず初期化を行う」を習慣づけることです。 ポインタや配列などは怠りがちになってしまいますが是非やってください。 NULLクリアしてあげるだけでもかなり違うと思います。 現在のOSは皆マルチタスクですからC言語の場合メモリ管理はプログラマがしっかりやらねばなりません。
お礼
ありがとうございます。 NULLとは文字列の最後に入っているやつですね、 絶対入れないといけないのですよね~?
- xjd
- ベストアンサー率63% (1021/1612)
コンパイルは通りますが、実行時に発生するエラーですね。 配列を定義した大きさを超えて、データを書き込んでしまったり、 不正な値が入っている・あるいはアクセスしてはいけないアドレスが入っているポインタ変数を使って値を書き込んだりした時に発生します。
お礼
ありがとうございます。アドレス違反ですね、、、 よくみてみます。
関連するQ&A
- c++ セグメントエラー
あるプログラムをつくっていて、コンパイルはできたのですが、セグメントエラーというランタイムエラーが取り除けません。 エラーの発生している行は特定できました。 その行は、以下のようなものです。 AAA aaa[4][64][4]; AAAは型名、aaaは配列名です。3次元配列の宣言でエラーが発生していました。 エラーの発生している行はこの行で、代入などを行っている部分ではありません。配列の大きさを考えてみても、メモリが足りなくなっているとは考えづらいのですが、他になにか原因はあるのでしょうか? 考えられる原因を教えてください。
- ベストアンサー
- C・C++・C#
- FORTRAN: WIN SalfordFTN77 → LINUX g77 (セグメントエラー)
今まで、Salford FTN77 を使用していたのですが、 この度、LINUXのg77でプログラムを動かすことになりました。 Salford FTN77で正常に動作していたのですが、g77では、実行時に「セグメント違反」が発生してしまいます。 現在わかっていることを列挙しますと… ・Salford FTN77では、問題なく動作する ・g77で、コンパイルまでは成功する ・Salford FTN77からの書き換えはおそらく成功(同種のプログラムで確認済み) ・プログラムをループ(=50)させているのですが、特定のループ回数(=13)でセグメントエラーになる。 ・エラー前の計算は正しく行われている ・ループ回数(=10)を引き下げると実行可能になる ・ループ毎にファイルのcloseも行っている ・スタックを限界まで引き上げて実行したが、同様のエラーが発生 ・特定のループ回数(=13)から、ある特定の変数(ここでは b)を、表示(write( , ) b )もしくは代入(a=b)しようとするとエラーが発生する。 ・エラーが発生する直前までは、ある特定の変数(b)は正しく出力でき、値に異常もない。 元々、簡単な数値計算をおこなう程度にしかプログラムを扱っていない生粋の初心者です。 ネットでセグメントエラーについて検索し、手当たり次第試してみたのですが、うまくいかず困っています。 ソースは公開できないのですが、何か心当たりのある方は、回答していただけると嬉しいです。 よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- コンパイラによってエラーが出たり出なかったり
構造体をポインタでつなぐリスト構造を使ったソースを書いて、Borland C++ Compiler 5.5 でコンパイルしたものを実行するとエラーで止まってしまいました。 コンパイル時には何も警告が出ませんでした。 しかし、ソースを何度見てもバグらしいコードが見つからなかったので、試しに Microsoft .NET Framework SDK でコンパイルしてみたところ、こちらも警告も出ずにコンパイルが通って、実行してみたらこんどは正常に動作しました。 コンパイラによって、実行時にエラーが出たり出なかったりするということは初めてなのでその原因を知りたくて質問しました。 どういった場合にこのようなことが起こるのでしょうか。 Borland C++ で出たエラーは、おそらくセグメントエラーだと思います。 今のところ正常に動いているのですが、なにかデンジャラスなコードを書いてしまった気がして気持ち悪いです。
- ベストアンサー
- C・C++・C#
- MicrosoftVisualC++2010エラー
学校でC言語を習っているので家でもやろうと思ってMicrosoft Visual C++ 2010 Expressをインストールしました。 取りあえず本を読みながら、プログラムを書いていたのですが、3個目くらいのプログラムを実行(デバッグなしで開始)したら、「ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?」というエラーが出てきて、実行できませんでした。 (はいを押すと、指定されたファイルが見つかりませんと出てきます。) しかも、前に書いたプログラムまで、実行したらそのメッセージが出るようになりました。 一応実行してエラーが出たプログラムも書いておきます。 #include <stdio.h> int main (void) { printf("こんにちは\n"); printf("さようなら\n"); return (0); } 原因がわかりません。 どなたかご教授願います。
- ベストアンサー
- C・C++・C#
- ど素人です。7セグメント表示の回路とプログラムを教えてください
CPUがZ-80のマイクロコンピュータで7セグメントLED表示の回路とプログラムを教えてください。プログラム言語はC言語でお願いします。
- 締切済み
- C・C++・C#
お礼
ありがとうございます。アドレス関係の違反なのですか、 がんばって確認してみます。