c언어 free()에 오류가 있는 것 같습니다..

익명 사용자의 이미지


결과가 이상하게 떠요..
분명 free도 맞게 한 것 같은데 하ㅜㅜ 도와주세요

#include <stdio.h>
#include <stdlib.h>
 
typedef int Element;
 
typedef struct tStackNode {
  Element data;  
  struct tStackNode *next;
} StackNode; 
 
typedef struct {
  int count;
  StackNode *top;
} Stack; 
 
Stack* CreateStack(int size)
{
  Stack *pStack = (Stack *)malloc(sizeof(Stack));
  if(pStack == NULL)
   return NULL;
 
  pStack->top = (StackNode *)malloc(size * sizeof(StackNode));
  if(pStack->top == NULL){
    free(pStack);
    return NULL;
  }
 
  pStack->top->next = (StackNode *)malloc(size * size * sizeof(StackNode));
 
 
  pStack->count = 0;
  pStack->top = NULL; 
  return pStack;
} 
 
 
void Push(Stack *pStack, Element item)
{
  StackNode *pNewNode = (StackNode *)malloc(sizeof(StackNode));
 
  if(pNewNode == NULL)
    return;
 
  pNewNode->data = item; 
  pNewNode->next = pStack->top; 
  pStack->top = pNewNode; 
 
  pStack->count++; 
  free(pNewNode);
  //pNewNode = NULL;
}
 
 
 
Element Pop(Stack *pStack)
{
  if(pStack->top == NULL)
    return 0;
  else {
 
    Element item = pStack->top->data;
    StackNode *pOldTop = (StackNode *)malloc(sizeof(StackNode));
    pOldTop = pStack->top;
    pStack->top = pOldTop->next;
    free(pOldTop);
    //pOldTop = NULL;
    pStack->count--;
    return item;
  }
}
 
 
void DestroyStack(Stack *pStack)
{
 
  if (pStack->top->next != NULL){
    free(pStack->top->next);
    pStack->top->next = NULL;
  }
 
  if(pStack->top != NULL)
  {
    free(pStack->top);
    pStack->top = NULL;
  }
 
  if(pStack != NULL) 
    free(pStack);
  return;
}
 
 
int main()
{
  int i = 0;
  int item = 0;
  Stack *pStack = CreateStack(100);
 
  printf("Input 10 numbers :"); 
  for(i = 0; i < 10; i++){
    item = 0;
    scanf("%d", &item);
    Push(pStack, item);
  }
 
  printf("Reversed :");
 
  while(pStack->count != -1){
    item = Pop(pStack);
    printf("%d ", item);
  }
 
  printf("\n");
 
 
  DestroyStack(pStack);
  pStack = NULL;
  return 0;
}
익명 사용자의 이미지

99.9999999999999999%의 경우에는 표준 라이브러리 함수에 문제가 있는 것이 아니라 코드에 문제가 있습니다.

처음에 CreateStack 함수에서 pStack->top과 pStack->top->next에 메모리를 왜 이렇게 많이 할당시켜 둔 건가요? 코드만 보아서는 CreateStack, Push, Pop에 모두 할당이 들어가 있는데, 정확히 어떤 걸 의도하신 건가요? 처음에 스택을 만들 때 100개에 해당하는 메모리를 할당하는 것? 아니면 매번 원소를 추가할 때마다 동적으로 할당하는 것?

익명 사용자의 이미지

이곳에선 질문자의 노력이 보여야 답을 얻을 수 있음.

본인이 짠 프로그램이라면 기본기능(아이템 1개 추가후 프린트) 부터 잘 동작하는지 확인해보시길..
본인이 짠 것이 아니라면.. 일단 이해부터 먼저 하시길.

익명 사용자의 이미지

이틀 간 스택구조부터 다시 이해하고 push pop이해하니 술술 풀리더라구요.. 조언 감사합니다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.