segmentation fault

segmentation fault(セグメンテーション違反)は、許可されていないメモリ領域へのアクセス あるいは 操作によって発生するエラーである。 例えば、NULLポインタの指すアドレスに値を書き込もうとした場合に発生する。

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    int *pn = NULL;
    printf("%p\n", pn); // 0x0

    *pn = 1; // Segmentation fault
    exit(0);
}

gdbを使えば、詳細な情報を得られる。

$ gdb a.out 

(gdb) r
Starting program: 
Reading symbols for shared libraries +.............................. done
0x0

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x0000000100000ec7 in main ()

(gdb) info stack
#0  0x0000000100000ec7 in main ()

segmentation fault発生時には、UNIX系システムではSIGSEGVシグナルを受け取る。

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>

void segv_handler()
{
    puts("trap SIGSEGV\n");
    exit(1);
}

int main(int argc, char* argv[])
{
    int *pn;
    printf("%p\n", pn);

    signal(SIGSEGV, segv_handler);

    *pn = 1;
    exit(0);
}