堆栈在c分配空间

时间:2017-01-22 12:26:26

标签: c stack

我正在尝试从我的课程笔记中实现一个堆栈,但是在编译时遇到了这个错误,不确定我是否已正确初始化它?我使用push函数后,我的代码会出现段错误。

更新:我现在看到双重初始化和分配给错误位置的值。

这是我的代码:

struct stackelem{
    char i;
    struct stackelem *prev;
};
typedef struct stackelem Elem;

struct thestack{
    Elem *tp;
};
typedef struct thestack Stack;

void InitialiseStack(Stack *s)
{
   Elem *e = malloc(sizeof(*e));   
   s->tp = (Elem *)calloc(1, sizeof(Elem));
   s->tp->prev = NULL;
}

void Push (Stack *s, int n)
{
   Elem *e;

   s->tp = (Elem *)calloc(1, sizeof(Elem));
   s->tp->prev = s->tp;
   s->tp->i = n;
   s->tp = e;
}

2 个答案:

答案 0 :(得分:0)

s->tp = (Elem *)calloc(1, sizeof(Elem));
s->tp->prev = s->tp;

您覆盖tp,然后尝试让它指向旧值。除非你以前保存它,否则这不会发生神奇的事情:

Elem *e = s->tp;

s->tp = (Elem *)calloc(1, sizeof(Elem));
if (s->tp)
{
  s->tp->prev = e;
  s->tp->i = n;
}
else
{
  s->tp = e;
}

现在,如果分配失败,该函数也不会破坏堆栈的状态。

答案 1 :(得分:-1)

这两个功能都没有意义。

void InitialiseStack(Stack *s)
{
  /* Elem *e = malloc(sizeof(*e));   */
   s->tp = (Elem *)calloc(1, sizeof(Elem));
   s->tp->prev = NULL;
}

void Push (Stack *s, int n)
{
   Elem *e;

   s->tp = (Elem *)calloc(1, sizeof(Elem));
   s->tp->prev = s->tp;
   s->tp->i = n;
   s->tp = e;
}

首先在InitialiseStack中分配内存

s->tp = (Elem *)calloc(1, sizeof(Elem));

然后在函数Push中覆盖指针s->tp的值。

s->tp = (Elem *)calloc(1, sizeof(Elem));

结果是内存泄漏。此外,每次调用函数Push时都会覆盖指针的值。还使用未初始化的指针e

Elem *e;

没有意义。

您只需要以下

void InitialiseStack(Stack *s)
{
   s->tp = NULL;
}

void Push (Stack *s, int n)
{
    Elem *e = malloc( sizeof( Elem ) );

    if ( e != NULL )
    {
        e->i = n;
        e->prev = s->tp;
        s->tp = e;
    } 
}