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에서 실행 잘 됩니다.
감사합니다
리눅스에선 잘 돌아가는군요.. 저두 어쩌다 보니 고쳤습니다!
댓글 달기