c指针作为输入

时间:2009-12-21 16:49:51

标签: c pointers input malloc

当我试图将元素推送到堆栈时,我得到分段错误,但是如果我打开堆栈的地址(我用“!!!”标记它们)并且它的符号接受它。但是这次在每次推送中,它都会创建新的地址并且不会增加最高价值。

typedef struct
{
  struct table **symbols; // array of the stack
  int top; //index of the top element
  int size; //maximum size of the stack
}stack;

void push(stack *stck,struct table *element)
{  
    if(stck->top == stck->size)
    {
      printf("stack is full");
      return;
    }

    stck = malloc(sizeof(stack));                                          !!!
    stck->symbols = (struct table **)malloc(50 * sizeof(struct table*));   !!!

    printf("top : %d\n",stck->top);
    stck->top = stck->top++;
    printf("%d"&stck->top);
    stck->symbols[stck->top] = element;
    printf("top : %d\n",stck->top);
}

4 个答案:

答案 0 :(得分:2)

你需要构建你的堆栈才能将任何东西推到它上面。例如。 create function stack_new将为您的堆栈分配内存并初始化其成员:

stack * stack_new (size_t size)
{
    stack * stck = malloc(sizeof(stack));
    stck->top = -1;
    stck->size = size
    stck->symbols = (struct table **)malloc(size * sizeof(struct table*));
    return stck;
}

现在,一旦使用上述功能正确构建了堆栈,就可以将其传递给push函数。

答案 1 :(得分:1)

您正在一个名为stck的变量中传递一个堆栈,但随后会分配一个新结构并将其分配给同一个指针。因此,您传入的堆栈永远不会被修改。我认为你不需要第一个malloc电话。

答案 2 :(得分:1)

在您致电push 之前,您将需要为该堆栈设置malloc空间。

随着!!!你是在每次推送时分配新内存,这是错误的。

没有!!!你永远不会分配内存

答案 3 :(得分:0)

如果在函数内部传递单个指针堆栈* stck然后传递malloc,则一旦你离开函数它就不会反映出来。

另外,为什么每次要推送时都需要为50个指针分配内存?

如下所示:

struct table
{
   //members go here
};

typedef struct
{
  struct table **symbols;
  int top;
  int size;
}stack;


struct table *get_elem(void)
{
   //logic for getting elements go here
}

void stack_push(stack *stck, struct table *element)
{

  if(stck->top==stck->size)
  {
    printf("Stack Full\n");
    return;
  }

  stck->top++;
  stck->symbols[stck->top] = element;
  return;
}

void stack_func()
{

 struct table *elem = NULL;
 stack *stck = (stack *)malloc(sizeof(stack));
 if(NULL==stck)
 {
   return;
 }

 stck->top = -1;
 stck->symbols = (struct table **)malloc(50 * sizeof(struct table *));

 if(NULL == stck->symbols)
 {
   free(stck);
   return;
 }

  stck->size = 49;

  elem = get_elem();
  //do check here for correctness of elem returned from get_elem

  stack_push(stck, elem);

  return;
}

希望这有帮助! :)