백준/c

백준_10816_숫자카드2

S0LL 2024. 5. 8. 23:44

 

쉬운 문제이지만, 처음 알게 된 지식이 있어 글을 적습니다.

 

여러분은 배열을 함수 내에서 선언하는 것과 함수 밖에서 선언하는 것의 차이를 아시나요?

전역 변수 / 지역 변수 말고 다른 부분에서요..

 

함수 내에서 선언하는 것은 stack 영역에 할당하게 되고, 

전역이나 static 으로 선언하는 경우는 data 영역에 할당하게 된다고 합니다.

 

#include <stdio.h>

int main(void)
{
    int result[20000001];
    int n;
    scanf("%d", &n);

    int k;
    for (int i = 0; i < 20000001; i++)
    {
        result[i] = 0;
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &k);
        result[k + 10000000]++;
    }

    int m;
    scanf("%d", &m);
    for (int i = 0; i < m; i++)
    {
        int j;
        scanf("%d", &j);
        printf("%d ", result[j + 10000000]);
    }
    printf("\n");

    return 0;
}

처음에 이렇게 작성하고 실행하는데 segmentation fault 가 계속 떠서 왜그런지 찾아보니까 

지역변수에서 크기가 큰 배열을 생성하면 segmentation fault 가 발생하므로,

 

전역변수로 선언해줘야 한다는 것을 알았습니다.

 

그래서 배열 선언을 전역으로 해주었더니 바로 해결되었습니다.

 

앞으로 크기가 큰 배열은 전역으로 선언하는 습관을 들여야 할 것 같습니다.

 

 

전체 코드)

#include <stdio.h>
int result[20000001];
int main(void)
{
    int n;
    scanf("%d", &n);

    int k;
    for (int i = 0; i < 20000001; i++)
    {
        result[i] = 0;
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &k);
        result[k + 10000000]++;
    }

    int m;
    scanf("%d", &m);
    for (int i = 0; i < m; i++)
    {
        int j;
        scanf("%d", &j);
        printf("%d ", result[j + 10000000]);
    }
    printf("\n");

    return 0;
}

'백준 > c' 카테고리의 다른 글

백준_1654_랜선자르기  (0) 2024.05.14
백준_1929_소수구하기  (0) 2024.05.12
백준_2839_설탕배달  (0) 2024.05.08
백준_24511_queuestack  (0) 2024.05.08
백준_12789_도키도키간식드리미  (0) 2024.05.06