这是用于创建二叉树的代码,它执行得很好。我不了解的是,在我看来,entry
函数内a.entry[i][j]=in.nextInt();
语句的temp->left==NULL
或temp->right==NULL
条件如何被评估为if()
,这应该引发分段错误,因为我没有在任何地方初始化节点insert(string)
的{{1}}或TRUE
指针。
left
以下是输出:
right
要检查它是否确实是UB还是NULL
运算符的作用,我运行了一个测试代码:
#include<iostream>
using namespace std;
class node
{
public:
string data;
node *left,*right;
};
class btree
{
private:
node *root;
public:
btree()
{
root=NULL;
}
void create();
void insert(string);
};
void btree:: create()
{
cout<<"\n\nEnter the no. of nodes you want to create: ";
int n;
cin>>n;
cin.ignore();
for(int i=0;i<n;i++)
{
cout<<"\nEnter data for node "<<i+1<<": ";
string input;
getline(cin,input);
insert(input);
}
}
void btree:: insert(string str)
{
if(root==NULL)
{
root=new node;
root->data=str;
return;
}
node *temp=root;
while(temp!=NULL)
{
cout<<"\n\nDo you want to enter the node in the left subtree or the right subtree of "<<temp->data<<"?(l/r): ";
char dir;
cin>>dir;
cin.ignore();
if(dir=='l')
{
if(temp->left==NULL)
{
temp->left=new node;
temp->left->data=str;
return;
}
else
temp=temp->left;
}
if(dir=='r')
{
if(temp->right==NULL)
{
temp->right=new node;
temp->right->data=str;
return;
}
else
temp=temp->right;
}
}
}
int main()
{
btree bt;
bt.create();
return 0;
}
测试代码的输出:
Enter the no. of nodes you want to create: 3
Enter data for node 1: 5
Enter data for node 2: 1
Do you want to enter the node in the left subtree or the right subtree of 5?(l/r): l
Enter data for node 3: 9
Do you want to enter the node in the left subtree or the right subtree of 5?(l/r): r
因此,测试代码似乎可以识别UB并引发段错误。为什么不输入第一个代码?
我尝试搜索类似的问题,但找不到。
答案 0 :(得分:0)
您应明确将left
和right
初始化为NULL
,0
或nullptr
(最好是{{1} }。正如其他评论者所提到的,当指针未初始化时,很有可能出现未定义的行为。
最佳做法(IMHO):
nullptr