세그먼테이션 오류란?
세그먼테이션 오류(Segmentation Fault, 줄여서 '세그 폴트')는 프로그램이 접근 권한이 없는 메모리 영역에 접근하려고 할 때 발생하는 런타임 오류입니다. 즉, 운영체제가 프로그램에 할당해 준 메모리 범위를 벗어난 주소를 읽거나 쓰려고 하면, 운영체제가 이를 감지하여 프로그램을 강제로 종료시킵니다.
세그먼테이션 오류의 주요 원인
세그 폴트는 대부분 포인터를 잘못 사용할 때 발생합니다. 대표적인 원인은 다음과 같습니다.
- 초기화되지 않은 포인터 사용: 포인터를 선언만 하고 유효한 메모리 주소로 초기화하지 않은 상태에서 역참조(dereference)하는 경우
- 해제된 메모리 접근(댕글링 포인터): free()나 delete로 이미 해제된 메모리를 포인터가 여전히 가리키고 있을 때 해당 메모리에 다시 접근하는 경우
- 배열 인덱스 범위 초과: 배열에 접근할 때 인덱스가 유효 범위(0부터 배열 크기 - 1까지)를 벗어나는 경우
오류가 발생하는 코드 예시
다음은 세그먼테이션 오류를 유발하는 전형적인 코드입니다.
int *ptr; // 초기화되지 않은 포인터
*ptr = 10; // 임의의 주소에 값을 쓰려다 세그 폴트 발생
int arr[5];
arr[10] = 1; // 배열 범위를 벗어난 접근으로 세그 폴트 발생예방 방법
세그먼테이션 오류를 줄이기 위해 다음과 같은 습관을 들이는 것이 좋습니다.
- 포인터 선언 시 반드시 NULL 또는 유효한 주소로 초기화하기
- 메모리 해제 후 포인터에 NULL을 대입하여 댕글링 포인터 방지하기
- 배열 접근 전 인덱스가 유효 범위 내에 있는지 확인하기
- Valgrind, AddressSanitizer 같은 메모리 디버깅 도구를 활용하기