세그멘테이션 폴트(Segmentation Fault)는 프로그램이 허용되지 않은 메모리 영역에 접근할 때 발생한다.
주로 잘못된 포인터 사용이 원인이다.
흔한 세그폴트 발생 원인
#include <stdio.h>
#include <stdlib.h>
int main() {
// 1. NULL 포인터 역참조
int *ptr = NULL;
// *ptr = 10; // 실행 시 세그폴트 발생!
// 2. 초기화되지 않은 포인터 사용
int *uninit;
// *uninit = 20; // 위험!
// 3. 배열 범위를 벗어난 접근
int arr[5];
// arr[10] = 50; // 운 좋으면 넘어가지만, 보통 세그폴트
// 4. 할당되지 않은 메모리에 쓰기
char *str = "Read Only";
// str[0] = 'W'; // 문자열 리터럴은 수정 불가 영역에 있어 세그폴트 발생
return 0;
}
코드 설명:
– 포인터를 사용하기 전에는 반드시 NULL 체크를 하거나 유효한 주소로 초기화해야 한다.
– 문자열 리터럴("...")은 메모리의 읽기 전용 구역에 저장되므로 포인터로 내용을 수정하려고 하면 세그폴트가 발생한다.
오늘 공부 기록의 중심은 C언어 세그폴트 원인 찾기였다.
포인터를 한 줄씩 따라가면서 하나씩 확인하다 보니 어느 순간부터 ‘왜’를 빼고 외우기만 해서 스스로 설명이 안 됐다.
작은 예제를 여러 번 재작성하면서 표현을 바꿨더니 개념이 더 단단해졌다.
같은 내용을 다른 변수 이름으로 다시 구현했더니 C언어 세그폴트 원인 찾기이 훨씬 또렷해졌다.
C언어 세그폴트 원인 찾기을 한 번에 끝내진 못했지만, 적어도 흔들리는 지점은 분명해졌다.
예전보다 덜 겁난다는 감각이 생긴 게 가장 큰 수확이었는 것 같다.