C언어

Segmentation Fault

Jueun Park 2020. 6. 19. 15:35

세그멘테이션 실패

:허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생

1. 읽기 전용 파일에 쓰기를 시도할 경우

2.운영체제 메모리 영역에 접근 시도한 경우

3.잘못된 메모리 영역접근( -1, NULL)

실제 예시를 보면 배열의 갯수가 -1개가 되는 경우 등 배열에서 문제가 생기는 경우가 자주 있다고 한다.

 

경험1. 파일 불러오기 오류

나 같은 경우 fopen을 사용하면서 if (fp == NULL) 를 검사하지 않아서 오류의 원인을 한 번에 못찾았다.

파일 포인터가 NULL인지 검사를 해보니, 왜인지 NULL이었다.

아무리 봐도 내 코드에는 오류가 없어서, 상대경로를 절대경로로 바꿔주고 읽어올 바이너리 파일을 미리 만들어 줬더니 실행이 됐다.

rb를 쓰면 파일이 없을 경우 만들어주는 걸로 알고 있고, 절대경로보다 상대경로가 헷갈리지 않는다고 생각했는데

왜 이런 결과가 나왔는지는 잘모르겠다.

경험2. 링크오류

링크드리스트에서 불러온 파일과 새로쓴 파일 사이에 연결이 끊겨서 오류가 난 적이 있다.

파일을 불러온 뒤에는 파일의 맨 마지막 node와 이어서 쓸 node를 반드시 연결해주자.

생각보다 잘 까먹는다.

경험3. 메모리할당을 안 한 경우

구조체 포인터나 링크드 리스트를 사용하면서, 메모리 할당을 까먹은 경우가 있으면

오류가 난다.

그건 마치 아래와 같은 상황이 된다.

int *a; //a라는 정수형 포인터 변수가 메모리 상에 만들어짐
*(a)=10; //a가 가리키는 주소에 10이라는 숫자를 저장하려고 함

//하지만 a가 가리키는 대상이 설정되지 않았으므로 에러가 남

구조체 포인터는 구조체를 가리킬 수 있는 포인터인 것 뿐이라서

실질적으로 데이터를 갖지 못한다.

구조체가 가리킬 데이터를 만들어 주는 방법은 두가지 이다.

구조체를 선언하여 만들어 주는 것, malloc을 통해서 할당해주는 것이다.

#include <stdio.h>
#include <stdlib.h>				//malloc을 사용하기 위한 라이브러리
typedef struct _P{
	int data; 				//데이터
	struct _P * next;			//링크드 리스트의 경우, 다음 node를 가리킬 포인터가 필요함
}P

int main(){
	P * pointer;				//구조체 포인터 선언
	P node;					//구조체 선언
    
    	pointer=&node;				//구조체 포인터에 가리킬 대상을 부여하는 첫번째 방법
	pointer=(P*)malloc(sizeof(P)); 		//두번째 방법 : 직접 메모리할당
    
    	free(pointer);
	return 0;
}