과제 하던 중에 나타난 malloc(): corrupted top size 에러
무슨 에러인고 찾아보니 malloc으로 할당한 동적메모리를 벗어나 메모리를 깨먹어버리는 경우 나타난다고 한다.
쉽게 생각하면 동적메모리의 배열의 인덱스 범위 바깥으로 나가는 경우.
정확히는 "C 또는 C++에서 동적 메모리 할당을 사용할 때, 힙(Heap) 메모리가 손상되었을 때 발생합니다.(by ChatGPT)" 라고 한다.
에러 발생 코드
그럼 어디서 생긴 문제인가 곰곰이 들여다보니 merge sort를 구현하다가 생긴 문제였다.
void merge(struct person array[], int left, int mid, int right) {
int i, j, k, l;
i = left;
j = mid+1;
k = left;
/* 분할 정렬된 array의 합병*/
while (i<=mid && j<=right) {
if (array[i].age <= array[j].age){
sorted[k++] = array[i++];
} else {
sorted[k++] = array[j++];
}
}
/* 남아 있는 값들을 일괄 복사 */
// right
if (i > mid) {
for (;j<=right; j++)
sorted[k++] = array[j];
}
// left
else {
for (;i<=right; i++)
sorted[k++] = array[i];
}
// 원본에 적용해주기
for (l=left; l<=right; l++)
array[l] = sorted[l];
}
void merge_sort(struct person array[], int left, int right) {
int mid = (left+right)/2;
if (left < right) {
merge_sort(array, left, mid);
merge_sort(array, mid+1, right);
merge(array, left, mid, right);
}
}
배열에 접근 + 인덱스 증감 부분의 코드를 찾아보니 금방 찾을 수 있었다.
// left
else {
for (;i<=right; i++)
sorted[k++] = array[i];
}
right 부분의 코드를 복붙해서 쓰다가 그만 저런 조건은 놓치고 말았나보다.
left는 array(원본 배열)의 mid 까지만 접근하도록 설계해놨었는데 mid를 넘어 right까지 접근하려니까 sorted의 범위를 벗어난 영역까지 접근을 한 것이다.
코드 수정
// left
else {
for (;i<=mid; i++)
sorted[k++] = array[i];
}
조건을 수정해주니 잘 돌아갔다.
수정 후 나이순으로 잘 정렬된 것을 확인할 수 있었다.
'학교 수업 > 컴프 3' 카테고리의 다른 글
실습 12주차 segmentation fault (0) | 2025.05.29 |
---|---|
C에서 math.h 사용할 때 주의할 점 (0) | 2025.05.22 |
2주차 실습 - 반복문 조건문 (0) | 2025.03.16 |
댓글