본문 바로가기
학교 수업/컴프 3

malloc(): corrupted top size

by JJong | 쫑 2025. 5. 24.

과제 하던 중에 나타난 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

댓글