C언어로 코딩을 하다보면 상당히 열받는 이런 문구를 자주 보게 될 것이다.
(위는 Linux 환경에서 C언어로 만든 프로그램을 돌려본 것이다.)
Segmentation fault (core dumped)
처음 이 에러 메시지를 보고 나면 이게 뭐지? 라는 생각이 들것이다. 위키피디아의 설명을 빌리자면 이 오류는 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.
다음은 일부러 Segmenation fault 를 발생시킨 코드의 예이다.
#include <stdio.h>
#include <stdio.h>
#include <stdbool.h>
void selection_sort(int* arr, int n);
int main() {
int i, choice = 4, size = 100;
void (*func_ptr) (int* arr, int n);
if (choice == 1) {
func_ptr = selection_sort;
printf("Selection sort - size : %d\n", size);
}
int* array = malloc(sizeof(int) * size);
for (i = 0; i < size; i++) {
array[i] = (rand() % 1000) + 1;
}
func_ptr(array, size); // func_ptr이 초기화 되지 않은 상태에서 실행 (Segmentation fault 발생!)
}
void selection_sort(int* arr, int n) {
int i, j, least, temp;
for (i = 0; i < n - 1; i++) {
least = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[least]) {
least = j;
}
}
temp = arr[i];
arr[i] = arr[least];
arr[least] = temp;
}
}
무엇 때문에 Segmentation fault가 발생했을까? void (*func_ptr) (int *arr, int n);은 함수를 가르치는 포인터이다. 코드를 자세히 보면 choice 1일 때 func_ptr이 select_sort 함수를 가르키도록 설정되어있는데, 위 코드에서는 choice가 4인 상태로 func_ptr은 어떤 함수로 가르치지 않는다. 그럼에도 불구하고 함수를 실행함으로써 Segmentation fault가 발생한다. 이렇듯 Segmentation fault는 NULL인 메모리에 접근할 때 발생한다. 따라서 Segmentation fault 에러가 발생하면 우선 NULL인 메모리에 접근했는지 생각해봐야 한다.
int* array = malloc(sizeof(int) * 10); // 크기가 10인 배열을 동적 할당
array[10] = 10; // 인덱스는 0~9까지인데 10에 값 할당 (Segmentation fault 발생!)
free(array);
또 다른 예시로 메모리를 동적 할당할 때, 할당받지 않은 메모리에 접근할 때도 Segmentation fault가 발생한다.
이렇듯이 Segmentation fault는 주로 NULL인 메모리나 할당 받지 않은 메모리에 접근할 때 주로 발생한다. C/C++에서는 포인터를 이용해서 코딩을 하는일이 잦은데 포인터를 통해 잘못된 메모리에 접근하지 않도록 주의하자.
'프로그래밍 언어 > c' 카테고리의 다른 글
구조체와 공용체 (0) | 2021.01.10 |
---|---|
포인터와 함수 그리고 void형 포인터 (2) | 2021.01.07 |
c언어 (1) - 포인터 (0) | 2021.01.05 |
C언어 파일 입출력 (2) (0) | 2021.01.03 |
C언어 파일 입출력 (1) (0) | 2021.01.03 |