0

以下のコードは実行中ですが、ツリーに挿入する 2 番目の数値を取得した後、プログラムがクラッシュします。なぜですか? ユーザー入力 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 node\n 0 to exit\n");
 scanf("%d",&choice);
 switch(choice)
 {
  case 1: printf("Enter number\n");
          scanf("%d",&n);
         insert(&head,n);break;
  case 0:exit(0);
 }
 }
}
4

1 に答える 1

2

新しいものを割り当てるときにleftまたはメンバーを初期化しませんrightnode

 if((*root)==NULL)
 {
  (*root)=(node*)malloc(sizeof(node));
  (*root)->data=n;
 }

を割り当てますnodeが、そのleftおよびrightメンバーは予測できない値を指すままにします。node2 番目のを割り当てると、insertはこれらの値の 1 つを逆参照しようとします。これにより、未定義の動作が発生します。遅かれ早かれ、コードで読み取れない、または正しく配置されていないアドレスを逆参照しようとすると、クラッシュが発生します。

new のすべてのメンバーを初期化することで、これを回避できます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;
}
于 2013-11-12T17:40:19.617 に答える