我有一个函数,它对队列和堆栈执行不同的操作,如推送、偷看、弹出、打印、初始化等。我已经完成了大部分操作,但我在pop_stack函数上遇到了内存泄漏和分段错误,我不确定原因。
pop_stack函数的代码是:
/* add entry to end of stack *stack */
/* allocate storage of data_size bytes in new entry */
/* copy data referenced by *data to entry */
/* return pointer to newly created entry */
/* print an error message and return if stack is NULL or empty */
/* or if data is NULL */
Node *push_stack(Stack *stack, void *data, size_t data_size)
{
Node *new_node;
Node *node;
void *new_data;
if (stack == NULL || data == NULL || stack->head == NULL)
{
fprintf(stderr, "warning: unable to push stack.n");
return NULL;
}
new_node = initialise_node();
new_data = (void *)malloc(data_size);
memcpy(new_data, data, data_size);
new_node->data = new_data;
return 0;
if (stack->tail == NULL)
{
stack->head = new_node;
stack->tail = new_node;
new_node->data = new_data;
return new_node;
}
else
{
node = stack->tail;
stack->tail = new_node;
new_node->prev = node;
new_node->next = NULL;
new_node->data = new_data;
}
}
堆栈的其余代码如下:https://pastebin.com/zAFGdAbJ
Valgrind的全部输出如下:https://pastebin.com/25LTHnMk
我的pop_stack函数中没有任何free((,这是因为我有另一个文件来完成所有的测试,在这个任务中,不是所有的free都由程序完成,而是由用户自己完成,所以由测试程序完成,而不是在函数内完成。我得到的那个文件的主要功能是:https://pastebin.com/iZmn6nGd
有人能帮我吗?
看起来return 0
放错地方了。您无条件地返回0(即NULL(,因此指针new_node
与调用堆栈一起被拆除,从而泄漏内存。