c언어 간단한 스택 malloc 후 free 문제..
글쓴이: whdtjr222 / 작성시간: 금, 2022/11/11 - 9:29오후
변경 전 코드
#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해준 것을 해제해줬다고 생각했는데 아니었나요...
저렇게 바꾸니 되네요!
Forums:


Ubuntu 20.04에서 실행 잘 됩니다.
Ubuntu 20.04에서 실행 잘 됩니다.
감사합니다
리눅스에선 잘 돌아가는군요.. 저두 어쩌다 보니 고쳤습니다!
댓글 달기