【发布时间】:2020-08-25 14:23:26
【问题描述】:
请阅读整篇文章,因为其中包含非常重要的小细节。
正如 C 所知道的,我们应该处理 malloc 失败的事件,对于这种情况,我创建了一个名为 destroyList() 的函数,其工作是获取指向 Node 的指针并一个一个地销毁它。
但是我的函数没有被正确调用...
我尝试使用 ptr、merged_out 和 *merged_out 调用它(最后一个是社区成员的建议),但似乎没有任何效果。
这是为什么?该函数有时会收到NULL、空列表或一些随机值。
有人可以帮我解决这个问题并让我了解发生了什么吗?
typedef struct node_t {
int x;
struct node_t *next;
} *Node;
void destroyList(Node ptr) {
while (ptr) {
Node toDelete = ptr;
ptr = ptr->next;
free(toDelete);
}
}
主要功能:
ErrorCode mergeSortedLists(Node list1, Node list2, Node *merged_out) {
if (!list1 || !list2) {
return EMPTY_LIST;
}
if (!isListSorted(list1) || !isListSorted(list2)) {
return UNSORTED_LIST;
}
if (!merged_out) {
return NULL_ARGUMENT;
}
Node ptr = NULL;
int total_len = getListLength(list1) + getListLength(list2);
for (int i = 0; i < total_len; i++) {
int min = getMin(&list1, &list2);
ptr = malloc(sizeof(*ptr));
*merged_out = ptr;
if (!ptr) {
destroyList(*merged_out);
*merged_out = NULL;
return MEMORY_ERROR;
}
ptr->x = min;
ptr->next = NULL;
merged_out = &ptr->next;
}
return SUCCESS;
}
函数的调用方式如下:
Node merged_actual = NULL;
ErrorCode merge_status = mergeSortedLists(list1, list2, &merged_actual);
注意:getMin() 获取最小值并将具有该最小值的列表指针前进到下一个节点。
【问题讨论】:
-
err 我明白为什么......你需要用列表的头部调用destroy list,而不是
merged_out,因为它指向列表的最后一个元素...... -
在第一次调用时声明一个静态变量或存储 head 的东西。喜欢
static Node head; static int flag=0; if (!flag){head=*merged_out;flag=1;} -
但我怎么能这样做,我花了 3 天时间,根本没有解决办法
-
我不允许使用静态或全局变量
-
@AdrianMole 抱歉,我知道其中的区别,但无法指向代码中的第一个节点
标签: c memory-leaks malloc free c99