C++ 我的C++;程序在此函数上崩溃?

C++ 我的C++;程序在此函数上崩溃?,c++,C++,我是一个初学者程序员(刚刚开始),为了好玩,我正在为二进制搜索树编写一些代码。 由于某种原因,每当我调用这个append函数时,我的程序就会崩溃。它与两个函数中的一个函数本身有关,而不是头文件或包含main()的源文件中的任何其他函数。顺便说一下,叶只是一个具有int值的结构,还有两个名为left和right的叶指针 这会崩溃,没有输出错误 Leaf* BinarySearchTree::GetLeaf(int x,Leaf*a) { int key = a->value; cout

我是一个初学者程序员(刚刚开始),为了好玩,我正在为二进制搜索树编写一些代码。 由于某种原因,每当我调用这个append函数时,我的程序就会崩溃。它与两个函数中的一个函数本身有关,而不是头文件或包含main()的源文件中的任何其他函数。顺便说一下,叶只是一个具有int值的结构,还有两个名为left和right的叶指针

这会崩溃,没有输出错误

Leaf* BinarySearchTree::GetLeaf(int x,Leaf*a)
{
 int key = a->value;
 cout <<key<<"\n";
 if(x > key)
 {
  if(a->right == NULL)
  {
   Leaf* newleaf = new Leaf();
   newleaf->value = x;
   a->right = newleaf;
   return newleaf;
  }
 else if (a->right != NULL)
 {
  return a->right;
 }
}
else if(x< key)
{
 if(a->left == NULL)
 {
   Leaf* newleaf = new Leaf();
   newleaf->value = x;
   a->left = newleaf;
   return newleaf;
 }
 else if (a->left != NULL)
 {
   return a->left;
 }
}
else if(x == key)
{
 //tbc
}
}
void BinarySearchTree::Append(int x)
{
  if(root != NULL)
  {
    Leaf* current = root;
    while(current->value != x)
    {
        current = BinarySearchTree::GetLeaf(x,current);
        cout<<"value: "<<
        current->value;
    }
  }
  else
  {
   cout <<" No ROOT!";return;
  }
}
Leaf*BinarySearchTree::GetLeaf(intx,Leaf*a)
{
int key=a->value;
cout right=newleaf;
返回newleaf;
}
如果(a->right!=NULL),则为else
{
返回一个->右键;
}
}
else if(xleft==NULL)
{
叶*newleaf=新叶();
newleaf->value=x;
a->left=newleaf;
返回newleaf;
}
如果(a->left!=NULL),则为else
{
返回a->left;
}
}
else if(x==键)
{
//待定
}
}
void BinarySearchTree::Append(int x)
{
if(root!=NULL)
{
叶*电流=根;
while(当前->值!=x)
{
current=BinarySearchTree::GetLeaf(x,current);
cout如果使用
x==key
调用
GetLeaf()
,则函数既不返回
nullptr
也不返回有效指针。这是一个潜在的崩溃源。在任何情况下都需要返回一些合理的值

更新:不要忘记在其构造函数中正确初始化叶结构(所有三个成员)


UPDATE2:也正确初始化根。我将使用nullptr初始化它,并更改append函数,使其在root==nullptr时创建第一个leave。

在BinarySearchTree构造函数中,您开始访问根而没有首先为其分配内存。这可能是您的崩溃。请尝试添加

root = new Leaf()
在构造函数的开头

编辑-更多信息:

C++不会自动为成员变量设置值,您通常需要手动初始化它们。(C++11允许您在声明中进行初始化)。这意味着任何未设置为值的变量都将包含一个垃圾值。如果将此垃圾值用作指针,则极有可能发生崩溃

在您的例子中,最初的问题之一是LinkedList类在开始引用它之前没有在构造函数中初始化它的根成员变量

BinarySearchTree也有同样的问题


学习使用调试器是学习编程时能做的最好的事情之一。它让你一次一行地检查代码,并查看每个变量的值。这使我很容易看到事情没有按照你的计划进行。你使用哪个调试器取决于你的平台。

我是一个初学者程序员(刚刚开始)我正在为一个二元搜索树编写一些有趣的代码
为什么不从更简单的东西开始呢?如何调用append函数?现在是学习如何使用调试器的好时机。它将向您显示崩溃的位置,并让您了解导致崩溃的情况。想想如果
GetLeaf
没有另外,为了使你的生活更容易(也允许你学习得更快),我建议你采用一些常用的缩进风格(C++中常用的4个空格),并使用代码格式化程序或自动压入机(任何IDE都值得做的任何事情)。保持代码整洁。它也有助于查找错误,例如不匹配的
if
..
else
对。但是,如果我尝试在该块的输出中打印某些内容,它将一事无成。因此我相信它永远不会到达那里。无论如何,修复此问题。只需返回现有叶。也可以查看我的更新答案。他用“if(root!=NULL)”来覆盖此问题好的,谢谢。那么我在BinarySearchTree类中使用Leaf*root有什么问题吗?(我想是第22行)嘿,伙计们,我更新了GetLeaf函数以在函数末尾返回a,但它仍然崩溃。我知道它是GetLeaf函数,因为我在它前后添加了一些cout语句,它在之前打印了语句,但从未到达下一个。@Silicomancer root不会为NULL,因为没有任何东西将它设置为NULL。这是一样的与叶结构一样的问题-成员值未初始化。它只打印“1st”。可能由于某种原因这就是它崩溃的地方?