我在为某个结构体实现堆栈时遇到了很多问题。我做了这个堆栈......
struct com_stack
{
unsigned el_num;
command_t *stk;
unsigned top;
};
typedef struct com_stack *com_stack_t;
我还创建了几个函数来利用堆栈。
com_stack_t build_com_stack(unsigned num)
{
com_stack_t s;
s=malloc(sizeof(*s));
s->el_num=num;
s->stk=(command_t*)malloc((sizeof(command_t))*num);
s->top=0;
return s;
}
void com_push (com_stack_t s, command_t input)
{
if(s->top == (s->el_num - 1))
{
s->el_num+=64;
s->stk=(command_t)realloc(s->stk, sizeof(struct command) * s->el_num);
}
s->stk[s->top]=input;
s->top++;
}
command_t com_pop (command_t)
{
if(s->top==0)
error(1,0, "nothing to pop");
s->top--;
return s->stk[s->top];
}
当push推出然后弹出struct指针时,我遇到了问题。所以command_t是一个结构的指针,该结构的成员是一个联合中的char **。在运行以下测试时,它本身可以正常工作,但是当我使用堆栈时,我会遇到分段错误。
...
command_t com;
com=(command_t)malloc(sizeof(struct command));
com=build_scom_command(buffer, b_start, b_end);
com_stack_t cm_st;
//cm_st=(com_stack_t)malloc(sizeof(struct com_stack));
cm_st=build_com_stack(50);
com_push(cm_st,com);
command_t com_two;
com_two=com_pop(cm_st);
char* temp;
temp=(char*)malloc(1000);
temp=com_two->u.word;
unsigned i=0;
while(temp[i]!=NULL)
printf("%c",temp[i++]);
...
char **的第一个元素(com_two-> u.word,其中word是char **的名称)是我想要测试的字符串,但是在while循环中我遇到了分段错误。任何关于如何处理堆栈的建议或帮助都将非常感激。
编辑在所有有用的输入之后我仍然有seg错误。如果这里的一切看起来都很好,那么我应该检查一下原来的代码(此时一团糟)。任何其他输入将不胜感激,如果我确实解决了这个问题,我将发布我所做的和属性信用。感谢
编辑2 必须在返回前将pop函数更改为减少。修复了代码,所以上面现在处于正常工作状态。
答案 0 :(得分:1)
您需要为s
com_stack_t build_com_stack(unsigned num)
{
com_stack_t s;
s->el_num=num;
...
return s;
}
cm_st=(com_stack_t)malloc(sizeof(struct com_stack));
cm_st=build_com_stack(50);
应该是
com_stack_t build_com_stack(unsigned num)
{
com_stack_t s;
s = malloc(sizeof(*s));
s->el_num=num;
...
return s;
}
com_stack_t cm_st = build_com_stack(50);
如果要使用(传递)在构建函数外部分配的指针:
void build_com_stack(com_stack_t s, unsigned num)
{
s->el_num=num;
...
/* return s; There is no need to return */
}
cm_st = malloc(sizeof(struct com_stack)); /* Don't cast malloc */
build_com_stack(cm_st, 50);
正如@Qix所指出的
struct com_stack
{
unsigned el_num;
command_t *stk;
unsigned top;
} <-- You are missing a semicolon