-1

ファイルから行を読み取って二分探索木を実装しようとしています。

  while(fgets(p, 1024, fp))
  {
     struct node child;
     child.str = (char *)malloc(plen);      
     strcpy(child.str,p);
     insert(&tree,&child);
  }

問題は、子の完全な新しいコピーを作成する方法が見つからないように見えることです。代わりに、whileループが再起動するたびに値が変更されるだけです。

4

3 に答える 3

3

これは、子へのポインタ(&child)が変更されていないためです。あなたはそれを印刷することによってこれをあなた自身に納得させることができます:

printf("address of child = %p\n", &child);

解決策:ノードも割り当てる必要があります。

struct node*child = malloc(sizeof(struct node));

child.str次に、ポインタ構文を使用して、そのまま割り当てることができます。

child->str = (char *)malloc(plen);      
strcpy(child->str,p);

...そして子はポインタなので、ここではアンパサンドは必要ありません。

insert(&tree,child);
于 2012-10-06T20:14:54.057 に答える
3

見ずに言うのは難しいinsert()。私の推測では、自動struct nodeは各反復で範囲外になります。そのような変数へのポインタは無効になりました。

于 2012-10-06T20:14:55.150 に答える
1

このように関数に定義すると

struct node child;

これは一時的なメモリであるため、機能を終了した後、データを失うリスクがあります。mallocしたがって、またはを使用して構造体を動的に定義する必要がありますcalloc

struct node *child = malloc(sizeof(struct node));

また

struct node *child = calloc(1,sizeof(struct node));

callocはメモリの割り当てを許可し、それを0に設定します

于 2012-10-06T20:21:36.923 に答える