스택 오버플로우가 왜 발생하는 지 모르겠어요...

조회수 1417회

정렬기준에 따라 학생 정보를 정렬해서 출력하는 프로그램을 만들고 있는데 배열 0행인 이름끼리 비교하면 별 문제가 없는데 1행인 학번으로 비교하면 정상적으로 컴파일 되지만 실행하면 *** stack smashing detected ***: terminated Aborted 라는 문자가 뜨며 제대로 출력되지 않아서요. 이유나 해결방법에 대하여 알려주시면 정말 감사하겠습니다. ubuntu, gcc 사용 중입니다

#include <stdio.h>
#include <string.h>

char student[20][3][10] = {{"Sophia", "20220001", "98"}, {"Olivia", "20220010", "96"}, {"Riley", "20220002", "88"}, {"Emma", "20220015", "77"}, {"Ava", "20220009", "82"}, {"Isabella", "20220014", "93"}, {"Aria", "20220020", "84"}, {"Amelia", "20220005", "79"}, {"Mia", "20220016", "90"}, {"Liam", "20220008", "80"}, {"Noah", "20220012", "89"}, {"Jackson", "20220004", "99"}, {"Aiden", "20220018", "78"}, {"Elijah", "20220017", "83"}, {"Grayson", "20220003", "92"}, {"Lucas", "20220013", "71"}, {"Oliver", "20220007", "72"}, {"Carden", "20220019", "68"}, {"Mateo", "20220011", "95"}, {"David", "20220006", "76"}};

void nameasc(void) {
    char asc[20][3][10];
    char tmp[10];
    for(int i  = 0 ; i < 20 ; i++){
        for(int j = 0 ; j < 3 ; j++){
            strcpy(asc[i][j], student[i][j]);
        }
    }
    for (int i = 0 ; i < 20 ; i++){
        for (int j = 0 ; j < 20 - i ; j ++){
            if(strcmp(asc[j][0], asc[j+1][0]) > 0){
                for(int k = 0 ; k < 3 ; k++){
                    strcpy(tmp, asc[j][k]);
                    strcpy(asc[j][k], asc[j+1][k]);
                    strcpy(asc[j+1][k], tmp);
                }
            }
        }
    }
    printf("name          studentID    score\n");
    for(int i = 0 ; i < 20 ; i++){


            printf("%s     %s     %s %d\n",asc[i][0], asc[i][1], asc[i][2], i);
    }

}

void idasc(void) {
    char asc[20][3][10];
    char tmp[10];
    for(int i  = 0 ; i < 20 ; i++){
        for(int j = 0 ; j < 3 ; j++){
            strcpy(asc[i][j], student[i][j]);
        }
    }
    for (int i = 0 ; i < 20 ; i++){
        for (int j = 0 ; j < 20 - i ; j ++){
            if(strcmp(asc[j][1], asc[j+1][1]) > 0){
                for(int k = 0 ; k < 3 ; k++){
                    strcpy(tmp, asc[j][k]);
                    strcpy(asc[j][k], asc[j+1][k]);
                    strcpy(asc[j+1][k], tmp);
                }
            }
        }
    }
    printf("name          studentID    score\n");
    for(int i = 0 ; i < 20 ; i++){


            printf("%s     %s     %s %d\n",asc[i][0], asc[i][1], asc[i][2], i);
    }

}

실행 결과

~$ ./a.out
     0001     84
name          studentID    score
���     0020     ��򈀞�r�  0
     20220001     98 1
     20220002     88 2
     20220003     92 3
     20220004     99 4
     20220005     79 5
     20220006     76 6
     20220007     72 7
     20220008     80 8
     20220009     82 9
     20220010     96 10
     20220011     95 11
     20220012     89 12
     20220013     71 13
     20220014     93 14
     20220015     77 15
     20220016     90 16
     20220017     83 17
     20220018     78 18
     20220019     68 19
*** stack smashing detected ***: terminated
Aborted

1 답변

  • 이 문제는 배열의 범위를 초과하여 접근하려고 하기 때문에 발생하는 오류입니다. C 언어에서 배열의 인덱스는 0부터 시작하므로, 예를 들어 20개의 요소를 가진 배열에서 마지막 요소의 인덱스는 19입니다.

    하지만 'nameasc' 함수와 'idasc' 함수에서 다음과 같이 20번째 요소(인덱스 20)에 접근하려고 하고 있습니다:

    if(strcmp(asc[j][0], asc[j+1][0]) > 0)

    if(strcmp(asc[j][1], asc[j+1][1]) > 0)

    j가 19가 될 때 asc[j+1]는 배열 범위를 초과하게 됩니다.

    따라서 다음과 같이 수정해야 합니다:

    for (int j = 0 ; j < 19 - i ; j ++){
    

    위와 같이 수정하면 j가 0에서 18까지 변하며, asc[j+1]은 항상 배열의 범위 내에 있게 됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)