「セグメンテーション違反」の版間の差分

削除された内容 追加された内容
→‎例: sourceタグを使用。
15行目:
このコードを含むプログラムが[[コンパイラ|コンパイル]]された時、"hello world"の[[文字列]]リテラルはリードオンリーとしてマークされたプログラム[[実行ファイル|バイナリ]]のセクションに置かれる; ロードされたとき、オペレーティングシステムはそれをリードオンリーのメモリーセグメントで他の文字列と[[定数]]データで置き換える。
実行されたとき、''s''変数は、文字列の位置を指定するように設定され、変数を通して''H''文字をメモリに書き込むことが企てられるが、結果はセグメンテーション違反が起こる。このようなプログラムをコンパイルして実行すると、例えば次のような[[ランタイムライブラリ|ランタイム]]エラーを起こす:
<source lang="text">
<code>
$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault
</codesource>
 
以下は[[GNUデバッガ]]からのスタックトレースである:
<source lang="text">
<code>
Program received signal SIGSEGV, Segmentation fault.
0x1c0005c2 in main () at segfault.c:6
6 *s = 'H';
</codesource>
 
一方で、[[Linux]]上のgcc 4.1.1はデフォルトで[[コンパイルタイム]]エラーを発生させる:
<source lang="text">
<code>
$ gcc segfault.c -g -o segfault
segfault.c: In function ‘main’:
segfault.c:4: error: assignment of read-only location
</codesource>
 
セグメンテーション違反が起こる条件とそれらをそれら自身で宣言する方法はオペレーティングシステム特有のものである。
 
非常に一般的なプログラムエラーは[[Null|Nullポインタ]]の[[参照 (情報工学)|参照]]外し(Nullポインタを通した読み込みもしくは書き込み、C言語では"存在しないオブジェクトへのポインタ"を意味し、エラーインディケータとして使用される)であるので、大抵のオペレーティングシステムはNullポインタにアクセスがセグメンテーション違反を引き起こすようなアドレスをNullポインタにマッピングする。
 
== 関連項目 ==