Help me.
44
2019-09-29 18:08:14
4
222

c언어 고수님 도와 주세요ㅠㅠ



#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: atfer Normal block (#72) 오류가 나옵니다.
그런데, 다른 컴파일러(DEV C++, 온라인 컴파일)에서는 문제 없이 수행이 됬습니다.
혹시, 제 비주얼 스튜디오에 무슨 문제라도 생긴걸까요?? (2017버전이고, 거의 1년이 다되 갑니다.)

++ 추가 질문 ++
제가 주석 처리한 // s->top == (s->capacity * sizeof(element)); 이 문장있는 데요
이 코드가 들어가는게 맞다고 생각하는데 이것에 대해서도 알려주시면 감사하겠습니다.

도와주세요 ㅠㅠ
0
0
  • 답변 4

  • 아범테크
    519
    2019-09-29 18:45:54

    디버깅에서 정확히 어느 스탭에서 그 오류가 나는지 보심이...

    0
  • Help me.
    44
    2019-09-29 19:23:44
    free()함수 쪽에서 오류가 나요!! 
    근데, 왜 free()에서 오류가 나나요ㅠㅠ

    0
  • 아범테크
    519
    2019-09-29 20:04:07 작성 2019-09-29 20:08:45 수정됨

    is_full 이 완전히 틀렸네요.

    top과 capacity를 비교해야하는데 100의 값을 가지는 상수와 비교하게 되네요. 그래서 push할때 실제로 realloc이 발생하지 않고 버퍼(힙)오버플로우가 발생하네요.

    주석처리한 부분 비슷한걸 넣어줘야 하긴 하는데, 주석부분도 틀렸으니 좀 고치신 다음 넣어주세요.

    0
  • Help me.
    44
    2019-09-29 20:17:10

    감사합니다. ㅋㅋㅋ

    문제를 해결 했습니다. ㅋㅋ 제가 malloc함수를 오해했네요 ㅋㅋ

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.