セグメンテーションフォールトを発生させてみる

セグメンテーションフォールトを発生させるプログラム書いてみた。

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:セグメンテーション違反

STATUS_ACCESS_VIOLATION例外を受け取ったプログラムは終了するしかなくなるってことかな。