【发布时间】:2018-11-25 14:30:33
【问题描述】:
我有一个函数可以对队列和堆栈执行不同的操作,例如推送、查看、弹出、打印、初始化等。我已经完成了大部分操作,但是,我遇到了内存泄漏以及 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
谁能帮帮我?
【问题讨论】:
-
您在
pop_stack函数中存在错误,但您显示的代码是针对push_stack! -
请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 SE 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? ...
标签: c linked-list stack