下面的代码正在运行,但是在将第二个数字插入树中后,程序崩溃了。为什么会这样?用户输入 1 用于插入,0 用于退出提前感谢...
#include<stdio.h>
#include<stdlib.h>
typedef struct ll
{
int data;
struct ll *left;
struct ll *right;
}node;
void insert(node **root,int n)
{
if((*root)==NULL)
{
(*root)=(node*)malloc(sizeof(node));
(*root)->data=n;
}
else if(((*root)->data)<n)
{
insert(&(*root)->right,n);
}
else if(((*root)->data)>n)
{
insert(&(*root)->left,n);
}
}
main()
{
node *head=NULL;int choice,n;
while(1)
{
printf("Enter 1 to insert noden 0 to exitn");
scanf("%d",&choice);
switch(choice)
{
case 1: printf("Enter numbern");
scanf("%d",&n);
insert(&head,n);break;
case 0:exit(0);
}
}
}
分配
新node
时,不会初始化left
或right
成员
if((*root)==NULL)
{
(*root)=(node*)malloc(sizeof(node));
(*root)->data=n;
}
分配node
,但保留其left
和right
成员指向不可预测的值。 当您分配第二个node
时,insert
将尝试取消引用其中一个值。 这会导致未定义的行为;在尝试取消引用代码无法读取或对齐不正确的地址后,迟早会出现崩溃。
您可以通过初始化新node
的所有成员来避免这种情况:
if((*root)==NULL)
{
(*root)=malloc(sizeof(node));
(*root)->data=n;
(*root)->left=NULL;
(*root)->right=NULL;
}
或者,你可以使用 calloc
来分配内存,以初始化新node
的成员以0
if((*root)==NULL)
{
(*root)=calloc(1, sizeof(node));
(*root)->data=n;
}