MINE: RTE(SIGABRT: program aborted, probably assertion fail) 에러 원인을 못 찾겠습니다.

  • leejh6182
    leejh6182

    문제에 나와있는 예제는 문제없이 되는데 컴파일시 에러가 발생하네요
    어느부분에서 에러가 발생하는지 찾을 수가 없어 질문남깁니다.

    int r;
    int **dmz;
    int **mine;
    int **answer;
    int row, col;
    int U, D, L, R;
    bool match() {
    int **mine2;
    mine2 = (int
    )calloc(row,sizeof(int));
    for (int i = 0; i < row; i++) {
    mine2[i] = (int*)calloc(col,sizeof(int));

    }
    
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (mine[i][j] == 1) {
    
                if (i - 1 >= 0)
                    mine2[i - 1][j] += U;
    
                if (i + 1 < row)
                    mine2[i + 1][j] += D;
    
                if (j - 1 >= 0)
                    mine2[i][j - 1] += L;
    
                if (j + 1 < col)
                    mine2[i][j + 1] += R;
    
            }
        }
    }
    
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (dmz[i][j] != mine2[i][j]) {
                free(mine2);
                return false;
            }
        }
    }
    
    free(mine2);
    return true;

    }
    void checkMine(int i,int j) {

    if (match() == true) {
        for (int i = 0; i < row; i++)
            for (int j = 0; j < col; j++)
                answer[i][j] = mine[i][j];
        return;
    }
    
    if (i >= row)
        return;
    if (i >= row && j >= col)
        return;
    
    
    
    mine[i][j] = 1;
    //다시 호출
    if (j == col - 1)
        checkMine(i + 1, 0);
    else
        checkMine(i, j + 1);
    
    mine[i][j] = 0;
    
    if (j == col - 1)
        checkMine(i + 1, 0);
    else
        checkMine(i, j + 1);

    }

    int main(void) {
    int test_case;

    cin >> test_case;
    while (test_case > 0) {
        cin >> row>> col;
        cin >> U >> D >> L >> R;
    
        dmz = (int**)malloc(sizeof(int)*row);
        mine = (int**)malloc(sizeof(int)*row);
        answer = (int**)malloc(sizeof(int)*row);
        for (int i = 0; i < row; i++) {
            dmz[i] = (int*)malloc(sizeof(int)*col);
            mine[i] = (int*)malloc(sizeof(int)*col);
            answer[i] = (int*)malloc(sizeof(int)*col);
    
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                cin >> dmz[i][j];
                mine[i][j] = 0;
            }
        }
    
        checkMine(0,0);
    
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                cout << answer[i][j];
            }
            cout << endl;
        }
    
        free(mine);
        free(dmz);
        free(answer);
    
        test_case--;
    }
    
    return 0;

    }


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

    메모리 할당 에러가 아닐까요? 할당시 int* 크기로 row 를 할당해야하고 free시도 할당과 마찬가지로 2중으로 해제해야 합니다.


    8년 전 link
  • leejh6182
    leejh6182

    메모리를 2중으로 해제하니깐 이제 memory 초과 문제가 발생하네요.. ㅋㅋㅋ 메모리를 적게 사용하는 방향으로 코드를 수정하면 문제가 해결될것 같습니다. 답변 감사합니다.


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