2

こういうことをしたいです。

typedef struct Test{
  int value;
  struct Test* parent;
  struct Test** children;
}Test;

したがって、別の親構造を指すノードが必要です。次に、子ノードを指す動的に割り当てられた配列が必要です。私の質問は、これが構文的にどのように機能するかわからないということです。

例えば、

Test* first;
Test* second;
Test* third;
(*third).value = 1;
(*first).parent = second;
(*first).child[0] = third;
printf("%d\n",(*first).(*child[0]).value);

コンパイルされません。ポインタの配列にスペースを割り当てるためにmallocで何かをする必要があると思いますが、よくわかりません。また、親ディレクトリと子ディレクトリの「値」にどのようにアクセスするかわかりません。

4

1 に答える 1

1

編集:私はあなたのためにすべての概念を実装する最後にideoneリンクを追加しました。

この回答の簡潔さについて申し訳ありませんが、それが適切にそれを行う方法をあなたに示すことを願っています。

Test* first = (Test *)malloc(sizeof(Test));  // malloc(sizeof(Test)) allocates enough memory to hold a Test struct
Test* second = (Test *)malloc(sizeof(Test));
first->value = 1; // -> is the proper way to dereference pointers in this situation (sorry wrong term? I am up late) but I suppose your style can work, it just gets a bit confusing IMO
first->*child = (Test *)malloc(intptr_t * number_of_children); // intptr_t will make sure you have the right size of a pointer, you could also use sizeof(Test *) instead. i.e. malloc(sizeof(Test *));
first->child[0] = second; // The array-style subscript is just more readable IMO
printf("%d\n",first->child[0]->value); // child[0]-> will handle the dereferencing in a nice way

しかし、私はあなたの人生を楽にするためのちょっとしたトリックをあなたに示すつもりです

typedef Test* test_array;

// ...later, in the struct...
test_array* child;

// ...later, in the malloc place...

first->child = (test_array *)malloc(sizeof(test_array *) * number_of_children);

他のすべては同じままで、構文IMOをはるかに理解しやすくなります。それらのトリッキーな二重星に対処するのに役立ちます。

編集:ここにリンクがあります-http: //ideone.com/TvSSB

于 2012-04-22T03:33:26.737 に答える