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

글쓴이: 익명 사용자 / 작성시간: 일, 2020/03/29 - 3:21오후
정수 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:
첨부 | 파일 크기 |
---|---|
![]() | 17.28 KB |
Forums:
...
에러는 마지막에서 세 번째 줄에 있습니다. n이 처음에 size로 들어가서 arr[size]를 참조하게 되는데, 어레이 인덱스는 0부터 시작하니까 size는 out of boundary에요. arrMax에서 n은 그 어레이의 마지막 인덱스니까 call을 할 때 size 대신 size-1을 넘겨야 합니다.
어떻게 디버깅을 하느냐는 여러 방법이 있습니다.
1. printf를 프로브로 잔뜩 집어넣어서 어디서 수행 흐름이 끊기는지 보는 방법
2. gdb나 Visual Studio 등 디버깅 툴을 배워서 사용하는 법
3. 컴파일러의 메모리 체킹 툴을 활용
gcc의 경우 이렇게 합니다.
4. static analysis tool을 활용
5. dynamic analysis tool을 활용 (SPARC의 discover나 Linux의 valgrind 등 종류가 많습니다)
답변 감사합니다!
익명으로 작성되어서 로그인해서 답글 달았어요.
댓글 달기