c언어 간단한 스택 malloc 후 free 문제..

whdtjr222의 이미지

변경 전 코드

#include <stdio.h>
#include <stdlib.h>
 
#define MAX_STACK 10
typedef struct Stack{
	int top;
	char* stack;
}stack_t;
void push(stack_t* stack, char input, int stackOfSize);
char pop(stack_t* stack);
void init(stack_t* stack);
int main(void)
{
	int sizeOfStack;
	stack_t* stack1 = (stack_t*)malloc(sizeof(stack_t));
	while (1) { // 제대로 입력 받을 때까지 반복
		scanf("%d", &sizeOfStack);
		if (sizeOfStack >= 0 && sizeOfStack <= MAX_STACK) {
			break;
		}
		else if (sizeOfStack < 0) {
			printf("0 이상의 자연수를 입력해주세요\n");
		}
		else if (sizeOfStack > 10) {
			printf("10 이하의 자연수를 입력해주세요\n");
		}
		else if (sizeOfStack == 0) {
			exit(0);
		}
	}
	stack1->stack = (char*)malloc(sizeof(char) * sizeOfStack);
	init(stack1);
	push(stack1, 'l', sizeOfStack);
	push(stack1, 'b', sizeOfStack);
	pop(stack1);
 
	free(stack1->stack);
	free(stack1);
 
 
}
void push(stack_t* stackstruct, char input, int sizeOfStack)
{
	if (stackstruct->top >= sizeOfStack) {
		for (int i = stackstruct->top; i >= 1; i--) {
			char temp;
			temp = stackstruct->stack[i-1];
			stackstruct->stack[i-1] = stackstruct->stack[i];
		}
		stackstruct->stack[stackstruct->top] = input;
	}
	else {
		stackstruct->stack[stackstruct->top++] = input;
	}
}
char pop(stack_t* stackstruct)
{
	if (stackstruct->top == 0) {
		printf("Empty Stack can't pop anymore");
		return 'N'; // command meaning nothing
	}
	else {
		return stackstruct->stack[stackstruct->top--];
	}
}
void init(stack_t* stackstruck)
{
	stackstruck->top = 0;
}

변경 후 코드
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_STACK 10
typedef struct Stack{
	int top;
	char* stack;
}stack_t;
void push(stack_t* stack, char input, int stackOfSize);
char pop(stack_t* stack);
void init(stack_t* stack);
int main(void)
{
	int sizeOfStack;
	stack_t* stack1 = (stack_t*)malloc(sizeof(stack_t));
 
	while (1) {
		scanf("%d", &sizeOfStack);
		if (sizeOfStack > 0 && sizeOfStack <= MAX_STACK) {
			stack1->stack = (char*)malloc(sizeof(char) * sizeOfStack);
			init(stack1);
			push(stack1, 'A', sizeOfStack);
			push(stack1, 'B', sizeOfStack);
			push(stack1, 'C', sizeOfStack);
			push(stack1, 'D', sizeOfStack);
			push(stack1, 'E', sizeOfStack);
			push(stack1, 'F', sizeOfStack);
			push(stack1, 'G', sizeOfStack);
			push(stack1, 'H', sizeOfStack);
			push(stack1, 'I', sizeOfStack);
			push(stack1, 'J', sizeOfStack);
			push(stack1, 'K', sizeOfStack);
 
			for (int i = 0; i < sizeOfStack; i++) {
				printf("%c", pop(stack1));
			}
			printf("\n");
			free(stack1->stack);
		}
		else if (sizeOfStack < 0) {
			printf("0 이상의 자연수를 입력해주세요\n");
		}
		else if (sizeOfStack > MAX_STACK) {
			printf("10 이하의 자연수를 입력해주세요\n");
		}
		else if (sizeOfStack == 0) {
			printf("Bye!\n");
			break;
		}
	}
	free(stack1);
}
void push(stack_t* stackstruct, char input, int sizeOfStack)
{
	if (stackstruct->top >= sizeOfStack) {
		stackstruct->top--;
		for (int i = 0; i < sizeOfStack - 1; i++) {
			stackstruct->stack[i] = stackstruct->stack[i + 1];
		}
		stackstruct->stack[stackstruct->top++] = input;
	}
	else {
		stackstruct->stack[stackstruct->top++] = input;
	}
}
char pop(stack_t* stackstruct)
{
	if (stackstruct->top == 0) {
		printf("Empty Stack can't pop anymore");
		return 'N'; // command meaning nothing
	}
	else {
		stackstruct->top--;
		return stackstruct->stack[stackstruct->top];
	}
}
void init(stack_t* stackstruck)
{
	stackstruck->top = 0;
}

코드 내용은 stack인데 push했을 때 받아온 stack의 size보다 스택에 들어가는 것이 많다면 가장 오래된 데이터를 삭제하는 코드입니다..
그런데 free할때 바로 에러가 뜹니다.. 그냥 malloc해준 것을 해제해줬다고 생각했는데 아니었나요...

저렇게 바꾸니 되네요!

라스코니의 이미지

Ubuntu 20.04에서 실행 잘 됩니다.

whdtjr222의 이미지

리눅스에선 잘 돌아가는군요.. 저두 어쩌다 보니 고쳤습니다!