C valgrind说我有条件跳转或移动取决于初始化值
我有一个问题,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
#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;