セグメンテーションフォールトを発生させてみる
セグメンテーションフォールトを発生させるプログラム書いてみた。
int main () { int* x = 10; printf ("%d\n", *x); }
コンパイルして実行してみる。
>gcc segfault.c -o segfault.exe segfault.c: 関数 'main' 内: segfault.c:3:12: 警告: 初期化で整数からキャスト無しにポインタを作成しています [デフォルトで有効] segfault.c:4:3: 警告: 組み込み関数 'printf' の互換性がない暗黙的な宣言です [デフォルトで有効] >segfault
こんなダイアログ出た。
終了するしかなくなった。
xはint*というふうに宣言してるので、ふつうの変数じゃなくてポインタになる。で、*xで表されるアドレス(10番地)をプリントしようとして、セグメンテーションフォールトが発生する。アドレス10番地はユーザープログラムだと読み取ることすらできないみたい。(Windows 7で検証)
UNIXライクのオペレーティングシステム上では、不正なメモリにアクセスをするプロセスはSIGSEGVシグナルを受け取る。Microsoft Windows上では、不正なメモリにアクセスするプロセスはSTATUS_ACCESS_VIOLATION例外を受け取る。
wikipedia:セグメンテーション違反