我遇到的问题是valgrind说我有条件跳转或者移动取决于初始化值
#include <stdio.h>
#include<stdlib.h>
ListNodePtr convertBSTtoLinkedList(TreeNodePtr root)
{
ListNodePtr newNode;
ListNodePtr leftLinkedList;
ListNodePtr rightLinkedList;
ListNodePtr head;
if (root == NULL)
{
return NULL;
}
newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
head = newNode;
if(root->left != NULL)
{
leftLinkedList = convertBSTtoLinkedList(root->left);
head = leftLinkedList;
ListNodePtr conductor;
conductor = leftLinkedList;
while (conductor->next != NULL)
{
conductor = conductor->next;
}
conductor->next = newNode;
}
if(root->right != NULL)
{
rightLinkedList= convertBSTtoLinkedList(root->right);
newNode->next = rightLinkedList;
}
return head;
}
valgrind问题是在while循环的某个地方,我假设它是因为我还没有初始化那个导体 - >接下来是NULL,但我不知道该怎么做,因为它检查它是否为NULL
答案 0 :(得分:2)
问题在于:
newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
head = newNode;
您创建了一个新节点并设置了密钥,但您没有设置next
指针。如果存在正确的子树,则会设置该值,如果该节点是叶节点,则不将被设置。
当处理叶子节点后对左侧的递归调用返回时,它会检查从未写入的next
指针。通过读取未初始化的值,您可以调用undefined behavior。
确保在创建节点时将此指针初始化为NULL
:
newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
newNode->next = NULL;
head = newNode;
答案 1 :(得分:0)
您可以在此处执行的操作是在代码中的某个位置创建节点,然后使用NULL
初始化。这很可能会关闭valgrind的这个信息。
所以在你的代码中添加这一行
newNode->next = NULL;
出现问题是因为您检查的值NULL
未使用NULL
进行初始化。因此,这种检查就好像它有一些未初始化的值。
我提到的解决方案只是使用正确的next
和key
值初始化每个节点。
几点:
检查malloc
的返回值是否失败或成功。
if ( newNode == NULL) { fprintf(stderr,"Error"); exit(1); }