在c中为结构创建堆栈

时间:2015-04-11 07:14:31

标签: c

我在为某个结构体实现堆栈时遇到了很多问题。我做了这个堆栈......

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函数更改为减少。修复了代码,所以上面现在处于正常工作状态。

1 个答案:

答案 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