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

时间:2017-11-16 16:13:55

标签: c valgrind

我遇到的问题是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

2 个答案:

答案 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进行初始化。因此,这种检查就好像它有一些未初始化的值。

我提到的解决方案只是使用正确的nextkey值初始化每个节点。

几点:

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

if ( newNode == NULL)
{
   fprintf(stderr,"Error");
   exit(1);
}