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의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.