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

보통 프로그래밍 공부 시작할때 c언어를 먼저 배우면 좋다고 합니다.
왜 그럴까요??
80%이상 프로그래밍 언어는 c를 바탕을 작성되었습니다.
이는 다른 프로그래밍언어를 배우고자 할때 더 빠르고, 쉽게 작성할 수 있습니다.

c언어 함수 구성(그 중에서 main함수 자료를 가져왔다!)

zapiro.tistory.com/entry/C%EC%96%B8%EC%96%B4-%ED%95%A8%EC%88%98function%EC%9D%98-%EA%B8%B0%EC%B4%88

(아래부분에 함수에 대해서 설명하는데 이해도 될듯합니다)

 

C언어 함수(function)의 기초 (함수의 구성, 정의, 호출)

함수(function)란? - 함수란 영어 function에서 온 말인데 이 뜻은 "기능"을 뜻한다. 즉, 기능을 구현하는 부분을 따로 떼어 구현하는 것으로, 구조화 프로그램의 중요한 개념이라 하겠다. 함수의 기본

zapiro.tistory.com

 

보통 인터넷을 찾아보면 이렇게만 작성되고 끝입니다. 그렇기에 저는 구체적으로 어떠한 점에서 다른지 말해보려합니다.
우선 저는 객체지향언어와 절차지향언어로 나눠서
설명드리자고합니다.

1. 변수타입(python은 타입 지정을 하지않지만 기반을 두고 있다고 봅니다.),
2. 모듈이해??(객체지향에서 어떻비슷한지?)
3. 그외
1~3로 나눠 설명드리고자합니다.


---------------------------------------여기서는 요약해서 말씀드리고자 합니다.-----------------------------------------------

 

: 언어 공통 // : 예시 // 가: c언어  // 가: java // 가: 꿀팁 // 가: 핵심 


《1》
기본 테이터 타입, 활용(응용)데이터 타입이 존재하며 [기본 데이터 타입]에
[숫자: 정수형(int), 실수형(기본적으로 double), 그외]
[활용(응용)데이터 타입]에는
[리스트(배열)
: 포인터배열(c언어) = 객체배열 (예시:java), 일반적 배열]로 구분됩니다.
[ 제네릭도 도입이되었습니다: c, java등.. (예시: java => 컬렉션&JList<E>&JComboBox<E>, C => void포인터) ]

 

기본 데이터 타입( 테이터 타입을 안쓰고 선언할 수 도 있으나 표현 방식을 동일하다!) 이 자료 사이트의 링크는 맨아래 추가적으로 같이 보면 좋을 사이트에 있습니다.




프로그래밍 언어 여러개 공부할 때 이해돕는 tip

*구체적으로 c언어에서는 구조체가 존재하며 이는 객체지향언어에서의 클래스와 제일 가깝습니다.
(java에서 클래스내 필드라 보면됩니다.)
*구조체 포인터배열은 c언어에서 객체배열에 제일 가깝다볼수있습니다.

《핵심》

기본 테이터 타입, 활용(응용)데이터 타입으로 구성되어있다고 생각하기!!! 기본데이터타입에서 데이터 관리가 필요하다해서 만들어 진게 활용(응용)데이터 타입이다!! 대표적인 예시를 그냥 기억해두고(받아들이고) 시작하면 훨씬 쉽게 공부하실 수 있습니다.
-----------------------------------------------------------------------------------------------------------------------------------

 


《2》객체지향언어인지 절차지향언어인지에 따라 모듈내 형태구현이 다릅니다.

일반적으로 프로그래머정의 함수(메소드&함수), 라이브러리함수(라이브러리 클래스, 헤더파일내 함수)로 구성!!
예시로
c언어의 함수는 사용자 정의함수라이브러리 (즉 헤더파일) 함수들이 있습니다.
java에도 사용자가 클래스를만들어 패키지화
할 수있으며
java기본패키지에서 제공하는
패키지 속 클래스를 가져다 쓸
수 있습니다.

+지원 라이브러리에 따라 해당 언어가 쓰이는 상황 차이가 나게됩니다.

객체 지향과 절차지향의 차이를 이해해보기~~(기능+데이터 = 클래스이며, 기능 = 함수(메소드), 데이터 = 변수(필드)를 의미한다.)

 

slidesplayer.org/slide/15298356/

 

제목 CHAPTER 04. 프로그래밍 언어 인간과 컴퓨터의 대화_진화하는 소통. 진화하는 컴퓨터. - ppt down

01 프로그래밍 언어의 개요 02 프로그래밍 언어의 실행 과정 03 절차 지향 언어의 프로그래밍 04 객체 지향 언어의 프로그래밍 05 교육용 프로그래밍 언어

slidesplayer.org

자료를 여기서 가져왔으며 프로그래밍 언어 전반적으로 이해하는데도 도움을 줄 수 있을 듯합니다.

《핵심》
프로그래머정의 함수(메소드&함수), 라이브러리함수(라이브러리 클래스, 헤더파일내 함수)로 구성되어있다고 생각하기!! 절차지향언어와 객체지향언어에 따라 차이를 보이는데 객체지향언어는 클래스 여러개 들어있는 패키지로 구성이 되며, 절차지향언어는 함수로 구성되어 있는 파일로 제공됩니다.

-----------------------------------------------------------------------------------------------------------------------------------

 


《3》그외

• 파일처리
• 그래픽, 문자열
※tip1
파일 입출력은 예외처리를 해주는것이 다른 프로그래밍언어에서 적용하기 편합니다.
ex) c java python 을 예시로들면 모두예외처리를 할수있으며 java같은경우는 예외처리가 필수입니다. 그리고 파일처리는 특히나 예외처리가 중요시되기에 tip1을 쓰는 습관을 들이는것이 매우좋습니다.
※tip2
c언어는 거의 기본이되지만 그래픽부분에서는 해당되지않으며, 문자열처리하기 까다롭습니다.
이러한 부분에서는 c언어를 권장하지않습니다.
다른언어로 프로그래밍 할 것!

-----------------------------------------------------------------------------------------------------------------------------------

 


이를 바탕으로 저는 프로그래밍을
계속 공부할려면 c언어,
아직 확실하지않거나 가볍게 공부하려면 python
을 추천드립니다.(뒤에올라올 글을 보시면 쉬울듯합니다. )
이글을 읽어주셔서 감사합니다~^^

 

 

추가적으로 같이 보면 좋은 자료

m.blog.naver.com/cosmos7256/221847512590

 

프로그래밍 언어 활용 총정리

00. Java 프로그래밍 기초- Java: 1995년 자바의 아버지라 불리는 제임스 고슬링 과 그의 동료들이 함께 ...

blog.naver.com

 

+ Recent posts