Segmentation Fault

@Super_E끌림·2024년 5월 11일
post-thumbnail

우리는 코딩을 하면 오류라는 것들이 발생한다.

코딩은 오류를 해결하는 작업이기도 하다.

그래서 해결 능력을 높이기 위해 1개 들고 나왔습니다.



---> segmentation fault error!!!

이것은 배열에 대한 오류이다.





참고한 자료



☑️ segmentation fault란?

잘못된 메모리 참조, 즉 건드리면 안되는 곳을 건드려서 발생하는 오류!

다른 말로 하면 할당 받지 못한 메모리에 접근하는 것을 말한다.





🚨 segmentation fault 발생 원인

1. null 값을 가리키는 포인터에 접근할 경우

2. 할당 받은 메모리 공간을 넘은 곳을 건드린 경우

3. 더 이상 존재하지 않는 메모리 영역을 가리킬 경우

4. read-only 표시 메모리 영역에 쓰려고 할 경우





예시 코드

저의 실제 사례 바탕인 코드



백준 10818번

#include <stdio.h>

int main(){
    unsigned int n;
    int temp;
    int arr[1000001];

    for(int i=0;i<n;i++)
        scanf("%d",&arr[i]);
    
    int i=0;

    for(;i<n-1;i++)
        if(arr[i] < arr[i+1])
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;

    printf("%d %d",arr[0],arr[n-1]);
}

결과 : segmentation fault


저번주부터 이거 쓰기 전까지 찐으로 의문이 들었다.

내가 알고 있는 배열이 이게 맞는데...?

열심히 구글링을 해봐도 찾을 수 없었다.


결국 chatgpt에게 물어봤다.

??? 진짜 물음표만 떠올랐다.

아니 크기를 지정 안했다?!

당연히 int arr[1000001];로 할당되어 있는데
n의 크기를 할당을 안했으니

segmentation fault 원인 2,3번에 해당된다.



오늘 또 1개 배워갑니다.



예시 코드를 바르게 고치면

#include <stdio.h>

int main(){
    unsigned int n;
    int temp;
    int arr[1000001];

    scanf("%d", &n);

    for(int i=0;i<n;i++)
        scanf("%d",&arr[i]);
    
    int i=0;

    for(;i<n-1;i++){
        if(arr[i] < arr[i+1]){
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }

    printf("%d %d",arr[0],arr[n-1]);
}

이 코드를 오류 해결을 위해 보여준 코드여서

백준 문제의 정답은 아닙니다 ㅎㅎ



이 주제와 별개로 반복문 들여쓰기 코드가 1줄이면 중괄화( { } ) 상관없지만

2줄 이상이면 중괄호( { } ) 반드시 필요합니다.

없으면 반복문 작동 안합니다.

그래서 항상 중괄호 쓰는 습관 들이면 좋을 것 갔습니다.

기본적인걸 왜 말하냐면 제가 거의 틀리기 때문에 그렇습니다. ㅎㅎ

profile
SoC:) SoC:)

0개의 댓글