Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 세그먼테이션 오류(Segmentation Fault)란 무엇일까?

세그먼테이션 오류란?

세그먼테이션 오류(Segmentation Fault, 줄여서 '세그 폴트')는 프로그램이 접근 권한이 없는 메모리 영역에 접근하려고 할 때 발생하는 런타임 오류입니다. 즉, 운영체제가 프로그램에 할당해 준 메모리 범위를 벗어난 주소를 읽거나 쓰려고 하면, 운영체제가 이를 감지하여 프로그램을 강제로 종료시킵니다.

세그먼테이션 오류의 주요 원인

세그 폴트는 대부분 포인터를 잘못 사용할 때 발생합니다. 대표적인 원인은 다음과 같습니다.

  • 초기화되지 않은 포인터 사용: 포인터를 선언만 하고 유효한 메모리 주소로 초기화하지 않은 상태에서 역참조(dereference)하는 경우
  • 해제된 메모리 접근(댕글링 포인터): free()나 delete로 이미 해제된 메모리를 포인터가 여전히 가리키고 있을 때 해당 메모리에 다시 접근하는 경우
  • 배열 인덱스 범위 초과: 배열에 접근할 때 인덱스가 유효 범위(0부터 배열 크기 - 1까지)를 벗어나는 경우

오류가 발생하는 코드 예시

다음은 세그먼테이션 오류를 유발하는 전형적인 코드입니다.

int *ptr;      // 초기화되지 않은 포인터
*ptr = 10;     // 임의의 주소에 값을 쓰려다 세그 폴트 발생

int arr[5];
arr[10] = 1;   // 배열 범위를 벗어난 접근으로 세그 폴트 발생

예방 방법

세그먼테이션 오류를 줄이기 위해 다음과 같은 습관을 들이는 것이 좋습니다.

  • 포인터 선언 시 반드시 NULL 또는 유효한 주소로 초기화하기
  • 메모리 해제 후 포인터에 NULL을 대입하여 댕글링 포인터 방지하기
  • 배열 접근 전 인덱스가 유효 범위 내에 있는지 확인하기
  • Valgrind, AddressSanitizer 같은 메모리 디버깅 도구를 활용하기