下面的代码成功地将二进制搜索树转换为链接列表,但是valgrind一直在给我"条件跳转或移动取决于未初始化的值"错误。看了我的代码后,我不知道我在哪里?
ListNodePtr convertBSTtoLinkedList(TreeNodePtr root)
{
ListNodePtr list,head;
list = malloc(sizeof(struct ListNode));
list->key = root->key;
if (root->right != NULL)
{
list->next = convertBSTtoLinkedList(root->right); //line 80
}
if (root->left != NULL)
{
ListNodePtr tail;
head = convertBSTtoLinkedList(root->left); //line 85
tail = head;
while (tail->next != NULL) { //Line 87
tail = tail->next;
}
tail->next = list;
return head;
}
return list;
}
这是我的valgrind错误,它会重复几次。
==3076== Conditional jump or move depends on uninitialised value(s)
==3076== at 0x108AF2: convertBSTtoLinkedList (bst.c:87)
==3076== by 0x108AC8: convertBSTtoLinkedList (bst.c:80)
==3076== by 0x108ADD: convertBSTtoLinkedList (bst.c:85)
==3076== by 0x108ADD: convertBSTtoLinkedList (bst.c:85)
==3076== by 0x108ADD: convertBSTtoLinkedList (bst.c:85)
==3076== by 0x108AC8: convertBSTtoLinkedList (bst.c:80)
==3076== by 0x108AC8: convertBSTtoLinkedList (bst.c:80)
==3076== by 0x108754: main (main_bst.c:28)
答案 0 :(得分:2)
malloc
为您提供指向未初始化内存的指针。因此,除非您设置ListNode
结构的每个成员,否则稍后尝试访问该成员是一个坏主意。
当您的convertBSTtoLinkedList
函数处理BST中没有正确子节点的任何节点时,它无法在创建的列表节点上设置next
。所以下一次在递归后的更高级别尝试查找返回子列表的结尾时,它会走到子列表的末尾,检查未初始化的next
指针,并且valgrind会抱怨。