C valgrind说我有条件跳转或移动取决于初始化值

C valgrind说我有条件跳转或移动取决于初始化值,c,valgrind,C,Valgrind,我有一个问题,valgrind说我有一个条件跳转,或者移动取决于初始化值 #include <stdio.h> #include<stdlib.h> ListNodePtr convertBSTtoLinkedList(TreeNodePtr root) { ListNodePtr newNode; ListNodePtr leftLinkedList; ListNodePtr rightLinkedList; ListNodePtr h

我有一个问题,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;
    }
#包括
#包括
ListNodePtr convertBSTtoLinkedList(TreeNodePtr根目录)
{
ListNodePtr-newNode;
ListNodePtr leftLinkedList;
ListNodePtr rightLinkedList;
ListNodePtr头;
if(root==NULL)
{
返回NULL;
}
newNode=malloc(sizeof(struct ListNode));
新建节点->键=根->键;
头=新节点;
如果(根->左!=NULL)
{
leftLinkedList=convertBSTtoLinkedList(根->左);
head=leftLinkedList;
ListNodePtr导体;
导体=leftLinkedList;
while(导体->下一步!=NULL)
{
导体=导体->下一步;
}
导体->下一步=新节点;
}
如果(根->右!=NULL)
{
rightLinkedList=convertBSTtoLinkedList(根->右);
新建节点->下一步=右链接列表;
}
回流头;
}

valgrind问题在while循环中的某个地方,我假设这是因为我没有初始化conductor->next为NULL,但我不知道怎么做,因为它检查它是否为NULL,这里你可以做的是在代码中的某个地方创建一个节点,然后用
NULL初始化next。这很可能会结束valgrind的消息

所以在代码中添加这一行

newNode->next=NULL

出现此问题的原因是,您正在检查为
NULL
的值未初始化为
NULL
。因此,这种检查就像是使用一些未初始化的值

我提到的解决方案就是用一个合适的
next
key
值初始化每个节点


几点:

检查
malloc
的返回值是否失败或成功

问题在于:

newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
head = newNode;
创建一个新节点并设置键,但不设置
下一步
指针
。如果存在右子树,则会设置该值;如果节点是叶节点,则不会设置该值

当对左侧的递归调用在处理叶节点后返回时,它会检查从未写入的
next
指针。通过读取未初始化的值,可以调用

确保在创建节点时将此指针初始化为
NULL

newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
newNode->next = NULL;
head = newNode;

如果有一些糟糕的
typedef ListNode*ListNodePtr及其类似的内容出现在程序中。如果您按照valgrind的建议在命令行中添加“-track origins=yes”,它将告诉您未初始化的值来自何处还有一个不相关的错误(如果
malloc()
耗尽内存并返回
NULL
?),会发生什么情况。
newNode = malloc(sizeof(struct ListNode));
newNode->key = root->key;
newNode->next = NULL;
head = newNode;