当我试图将元素推送到堆栈时,我得到分段错误,但是如果我打开堆栈的地址(我用“!!!”标记它们)并且它的符号接受它。但是这次在每次推送中,它都会创建新的地址并且不会增加最高价值。
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);
}
答案 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;
}
希望这有帮助! :)