HEAP CORRUPTION DETECTED: after Normal block (#72) at 오류 원인??

#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100

typedef int element;
typedef struct {
element *data;
int capacity;
int top;
} StackType;

void init_stack(StackType *s)
{
s->top = -1;
s->capacity = 1;
s->data = (element *)malloc(s->capacity * sizeof(element));
}

int is_empty(StackType *s)
{
return (s->top == -1);
}

int is_full(StackType *s)
{
return (s->top == (MAX_STACK_SIZE - 1)); // s->top == (s->capacity * sizeof(element));
}

void push(StackType *s, element item)
{
if (is_full(s)) {
s->capacity *= 2;
s->data = (element *)realloc(s->data, s->capacity * sizeof(element));
}

s->data[++(s->top)] = item;

}

element pop(StackType *s)
{
if (is_empty(s)) {
fprintf(stderr, “스택 공백 에러\n”);
exit(1);
}
else return s->data[(s->top)–];
}

int main()
{
StackType s;
init_stack(&s);
push(&s, 1);
push(&s, 2);

printf("%d \n", pop(&s));
printf("%d \n", pop(&s));

free(s.data);

return 0;

}

여기서 " HEAP CORRUPTION DETECTED: after Normal block (#72) at "와 같은 오류가 계속 생김니다.
그 이유가 무엇인지 도저히 ㅠㅠ 모르겠습니다.
다른 온라인 컴파일러와 DEV C++ 에서는 오류 없이 잘 돌아가는데 왜 visual studio 2017에서만 이런 오류가 나는지 모르겠습니다. 혹시 제 비주얼에 문제가 생긴걸까요?? (설치한지는 거의 1년이 되가고 문제 없이 사용 했습니다.)

+(참고)+ 이 코드는 자료구조 책에서 그대로 배낀 거고요…

++ 추가 질문 ++
// s->top == (s->capacity * sizeof(element));
이 주석 처리한 코드가 더 알맞는 코드이지 않을까 해서
적어 봤습니다. 이것에 대해서도 알려주시면 감사하겠습니다.

도와주세요 ㅠㅠ

IDE문제는 아니구요.
해당 오류는 일단 할당하지 않은 메모리에 접근해서 생기구요
할당하지 않은 메모리에 접근하는 이유는 is_full 함수가 제대로 동작하지 않아서입니다.

// s->top == (s->capacity * sizeof(element));

이 부분을 파악하신거를 보니 원인엔 접근하신 것으로 보이고, 생각하시던 방식으로 그대로 밀고가시면
해결될것입니다.

사실, 그것도 해봤는데 계속해서 오류가 생깁니다. ㅠㅠ
왜 그런 것일 까요??

free()함수 에서 오류가 나는 것을 발견했어요 ㅠㅠ
근데, 왜 free()에서 오류가 나는 것일까요??

image

free에서 난 이유는 위 문구에 있지여
메모리를 할당 했는데, 할당한 범위 내에서 쓰지 않고 다른 곳까지 침범을 했읍니다.
그래서 문제가 발생했디요.

그리고 그 이유는 첫 번째 댓글에 있지요.
is_full함수 안의 스택의 멤버 변수인 top은 인덱스입니다.
top은 element의 사이즈가 아니고 그냥 데이터의 배열의 인덱스를 가리킵니다.
data[top]인 것이죠…

원인을 분석을 할듯 말듯한 상황이신거 같은데,
이럴 땐, 처음부터 코드를 다시 짜보세여.
긴 코드라면 문제가 있지만, 다행히 코드가 짧으니까요.:grinning:

IDE를 활용한다면 코드를 한 줄씩 실행시키거나, 코드 안의 함수도 파고들어가며 디버깅을 할 수 있겠습니다. 방법을 아신다면 한 번써보세요. 저 역시 코드 보자마자 안 것은 아니니까여

3 Likes

감사합니다. ㅎㅎ 해결했습니다.
제가 malloc함수를 오해 했었네요 ㅋㅋ

도와주셔서 감사합니다.
저도 언제가 crmerry처럼 되고 싶네요 ㅋㅋㅋ

1 Like