我有一个函数可以对队列和堆栈执行不同的操作,例如推送,窥视,弹出,打印,初始化等。我已经完成了大多数操作,但是,内存泄漏以及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(),这是因为我有另一个文件对此进行了所有测试,在此任务中,不是所有的空闲都由程序来完成,而是由用户自己决定,因此由测试程序决定,而不是由功能内部完成。我所拥有的文件的主要功能在这里:https://pastebin.com/iZmn6nGd
有人可以帮助我吗?
答案 0 :(得分:2)
好像您的return 0
放在错误的位置。您无条件返回0(即NULL),因此指针new_node
随调用堆栈被拆除,从而导致内存泄漏。