#include <iostream>
int sizeWhileBuilding = 0;
int sizeWhileCounting = 0;
struct Node
{
Node( int theData ) :
data( theData ), left( NULL ), right( NULL )
{ std::cout << "Node::Node() with data " << theData << std::endl; }
int data;
Node* left;
Node* right;
};
Node* insertNode( Node* root, int data )
{
if( !root )
{
++sizeWhileBuilding;
std::cout << "Current size is " << sizeWhileBuilding << std::endl;
std::cout << "Making new node with " << data << std::endl;
root = new Node( data );
}
else if( root->data < data )
{
std::cout << "The node " << root->data << " is lesser than " << data << ". Making right node" << std::endl;
root->right = insertNode( root->right, data );
}
else if( root->data > data )
{
std::cout << "The node " << root->data << " is greater than " << data << ". Making left node" << std::endl;
root->left = insertNode( root->left, data );
}
return root;
}
int main()
{
std::cout << "Making binary tree" << std::endl;
Node* root;
if( root )
{
std::cout << "Root is NOT null after creation" << std::endl;
}
else
{
std::cout << "Root is null after creation" << std::endl;
}
std::cout << "==============================================================================" << std::endl;
root = insertNode( root, 10 );
//Problem line below
std::cout << "The size of the tree is " << sizeWhileBuilding << std::endl;
}
当我在注释掉"问题行"的情况下运行此代码时,它会运行并将节点 10 插入树中。当我使用问题行运行它时,我看到它核心转储。
当我在没有问题行的情况下运行时,我看到主打印开头的 else 部分"创建后根为空"。问题enter code here
行,"打印创建后根不为空"。
我不明白的是为什么 Node* 根;初始化取决于是否使用了全局变量?
Node* root;
root
是一个局部变量,如果不初始化,它的值将是垃圾。因此,有时它可能是空的,其他时候可能是空的。因此,如果使用它会导致未定义的行为,可能会以核心转储结束。解决方案是分配它:
Node* root = nullptr;
也:
我不明白的是为什么 Node* 根;初始化取决于是否使用了全局变量?
如果你的代码中有未定义的行为,那么一切皆有可能,还有你描述的那种奇怪的行为。