#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;
}
当我使用&#34;问题行&#34;运行此代码时注释掉,它运行并将节点10插入树中。当我用问题行运行它时,我发现它是coredumps。
当我在没有问题行的情况下运行时,我看到主打印开始时的else部分&#34; Root在创建后为空时#34;。对于问题enter code here
行,&#34;创建打印后,Root不为null&#34;。
我不明白为什么Node * root;初始化取决于是否正在使用全局变量?
答案 0 :(得分:1)
Node* root;
root
是一个局部变量,如果没有初始化,它的值将是垃圾。所以有时它可能是nullptr其他任何时候。因此,如果使用它将导致可能以coredump结尾的未定义行为。解决方案是分配它:
Node* root = nullptr;
也:
我不明白为什么Node * root;初始化取决于是否正在使用全局变量?
如果你的代码中有未定义的行为,那么任何事情都是可能的,也就是你描述的那种奇怪的行为。