스택 오버플로우가 왜 발생하는 지 모르겠어요...
조회수 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]
은 항상 배열의 범위 내에 있게 됩니다.
댓글 입력