ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Segmentation Fault
    C언어 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;
    }

     

    'C언어' 카테고리의 다른 글

    [Makefile] ar & rcs  (0) 2020.10.07
    Linked list (링크드 리스트)  (0) 2020.06.22
    문제로 배우는 C언어 - 스파이 찾기  (0) 2020.03.05
    문제로 배우는 C언어 - 자리찾기  (0) 2020.03.05
    C언어 연습문제  (0) 2020.03.02

    댓글

Designed by Tistory + Edited by Juepark