heap corruption detected after normal block 에러를 어떻게 해결해야하나요?

익명 사용자의 이미지

정수 n개에서 최댓값을 순환호출로 찾는 코드를 작성하는데 계속

HEAP CORRUPTION DECTECTED: after Normal block(#77) at 0x00F15C10.
CRT detected that the application wrote to memory after end of heap buffer.

이 디버그 에러가 뜨면서 끝나네요... 메모리 관련 문제인 것 같은데 어떻게 해결해야할까요??
아래는 작성한 코드입니다.

#include <stdio.h>
#include <malloc.h>
 
int arrMax(int *arr, int n);
 
int main(void) {
    int size, max;
    printf("배열의 칸 수를 입력하세요 : ");
    scanf("%d", &size);
    int* arr = (int*)malloc(sizeof(int) * size);
    printf("배열에 정수 %d개를 입력하세요 : ", size);
    for (int i = 0; i < size; i++)
        scanf("%d", &arr[i]);
 
    printf("\n");
 
    max = arrMax(arr, size);
    printf("배열의 값들 중 최댓값 : %d \n", max);
 
    free(arr);
 
    return 0;
}
 
int arrMax(int *arr, int n) {
    if (n == 0)
        return arr[0];
    int max = arrMax(arr, n - 1);
    arr[n] = max < arr[n] ? arr[n] : max;
    return arr[n];
}
File attachments: 
첨부파일 크기
Image icon 캡처.PNG17.28 KB
Stephen Kyoungwon Kim@Google의 이미지

에러는 마지막에서 세 번째 줄에 있습니다. n이 처음에 size로 들어가서 arr[size]를 참조하게 되는데, 어레이 인덱스는 0부터 시작하니까 size는 out of boundary에요. arrMax에서 n은 그 어레이의 마지막 인덱스니까 call을 할 때 size 대신 size-1을 넘겨야 합니다.

어떻게 디버깅을 하느냐는 여러 방법이 있습니다.
1. printf를 프로브로 잔뜩 집어넣어서 어디서 수행 흐름이 끊기는지 보는 방법
2. gdb나 Visual Studio 등 디버깅 툴을 배워서 사용하는 법
3. 컴파일러의 메모리 체킹 툴을 활용
gcc의 경우 이렇게 합니다.

 $ gcc -fsanitize=address,undefined a.c -g3 -O2 
 $ ./a.out  < input.txt 

4. static analysis tool을 활용
5. dynamic analysis tool을 활용 (SPARC의 discover나 Linux의 valgrind 등 종류가 많습니다)

lk7938의 이미지

익명으로 작성되어서 로그인해서 답글 달았어요.