我正在尝试从我的课程笔记中实现一个堆栈,但是在编译时遇到了这个错误,不确定我是否已正确初始化它?我使用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;
}
答案 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;
}
}