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의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.