런타임에러 질문드립니다.

  • rdd6584
    rdd6584
    #include<stdio.h>
    #include<stdlib.h>
    #include<memory.h>
    
    int n, k;
    int pbox[100001];
    int box[100001];
    int t[100000];
    int mod[100000];
    int hoho[100001];
    long long int cnt;
    long long int c;
    
    int main()
    {
        int cc;
    
        scanf("%d", &cc);
    
        while(cc--)
        {
            scanf("%d %d", &n, &k);
    
            cnt = 0; c = 0;
            memset(mod, 0, sizeof(mod));
            memset(t, 0, sizeof(t));
    
            mod[0]++;
            box[0] = 0;
            t[0]++;
    
            for (int i = 1; i <= n; i++)
            {
                scanf("%d", &hoho[i]);
                box[i] = box[i - 1] + hoho[i];
                pbox[i] = box[i] % k;
                mod[pbox[i]]++;
            }
    
            for (int i = 0; i < k; i++)
                cnt += mod[i] * (mod[i] - 1) / 2;
    
    
            if (k == 1)
                c = n;
    
            else
                for (int i = 1; i <= n; i++)
                    if (t[pbox[i]]++ || hoho[i]%k == 0)
                    {
                        memset(t, 0, sizeof(t));
                        c++;
                    }
    
            printf("%lld %lld\n", cnt % 20091101, c);
    
        }
    }
    

    CHRISTMAS 문제입니다. 위 코드가 C로 제출시 런타임에러가 발생하는데, C++로 제출시에는 에러가 나지 않는 이유가 궁금합니다.


    8년 전
2개의 댓글이 있습니다.
  • Arine
    Arine

    컴파일 옵션이나 환경, 컴파일러 등에 따라 전역변수도 초기화하지 않으면 예상치 못한 값이 들어가는 경우가 있는 것 같습니다. 입력 부분에서 아래 줄이 문제가 된 것으로 보이는데요
    mod[pbox[i]]++;
    pbox를 직접 초기화하지 않아 mod 배열의 인덱스를 넘어가기 때문에 런타임 에러가 발생한 것 같습니다.

    답변과는 별개의 이야기로, 런타임 에러가 날 때 의심해 볼 만한 이유로는

    • 배열의 인덱스를 넘어가는 경우 (잘못된 메모리를 참조하는 경우)
    • 0으로 나누는 경우

    등이 있습니다. 첫 번째가 가장 흔한 경우죠. 그러므로 위와 같은 경우가 발생할 것 같은 그런 곳에 assert등으로 확인을 하거나 커맨트 블락으로 만들어버린 후, 런타임 에러가 날 때 까지 하나하나 언커맨트 하는... 그런 간단한 방법으로도 금방 어느 지점이 문제인지 찾을 수 있습니다. 다음에 이런 문제를 만난다면 스스로 디버깅을 한 번 시도해 보세요 ;)


    8년 전 link
  • rdd6584
    rdd6584

    답변감사합니다. 그런데 pbox[i]의 경우 이미 %k 로 초기화를해쥤는데도 해당오류가 발생할까요? 따라서 배열인덱스를 넘는거같지가 않거든요


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.