세그멘테이션(Segmentation) 오류란?

세그멘테이션(Segmentation) 오류의 원인을 일반화해서 해결책을 제시하기는 어렵지만 개념을 이해하면 적절히 상황에 맞게 원인을 유추할 수는 있습니다.

세그멘테이션(Segmentation) 오류

운영 체제(OS)에서 세그멘테이션 오류는 프로그램이 올바르지 않은 메모리 영역에 접근하려고 할 때 발생하는 예외입니다. 예외 발생 시 운영 체제는 프로세스를 종료시키고 종종 코어 덤프를 생성합니다.

 

주로 C/C++ 코드에서 자주 발생합니다. C/C++에서는 메모리 관리를 개발자가 수동으로 해야 하는 특성을 가지고 있기 때문입니다.

 

발생하는 상황들

1. 함수 포인터를 초기화하지 않고 호출

void (*func_ptr)(); // 초기화되지 않은 함수 포인터
func_ptr(); // 초기화되지 않은 함수 포인터 호출로 인한 세그멘테이션 위반 발생

 

2. 배열 범위를 넘어서는 인덱스 사용

int arr[10];
arr[100] = 42; // 범위를 벗어난 인덱스 사용

 

3. 동적 메모리 할당 후 해제한 메모리에 접근

int *ptr = (int *)malloc(sizeof(int));
free(ptr);
*ptr = 42; // 이미 해제된 메모리에 접근

 

4. 스택 오버플로우. 재귀 함수를 사용할 때 깊이 제한을 설정하지 않거나, 함수 호출 시에 스택 메모리를 과도하게 사용

void recursive_function() {
    int large_array[100000];
    recursive_function(); // 스택 오버플로우로 인한 세그멘테이션 위반 발생
}

 

5. 널 포인터 참조. 초기화되지 않은 포인터를 사용하거나, 널(NULL)로 설정된 포인터를 참조

int *ptr = NULL;
*ptr = 42; // 널 포인터 참조로 인한 세그멘테이션 위반 발생
반응형

댓글

Designed by JB FACTORY