2012-04-22 20 views
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で何かをする必要があると仮定していますが、わかりません。また、私は親ディレクトリと子ディレクトリの "値"にどのようにアクセスするのかよく分かりません。

答えて

1

EDIT:すべてのコンセプトを実装する最後に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

+0

ありがとうございました。ここではmallocへの呼び出しをキャストしない限りコンパイルはしません。その場合のエラーは「エラー: 'void *'から 'Test * {別名main():: Test *}' [-fpermissive]に変換できません " –

+0

mallocがハッピーになるようにキャストを追加しました –

+0

また最初の子のmallocを更新しました。最初の子=(テスト**)か最初の*子=(テスト*)であるべきかどうかを判断するのは時期尚早です。私はそれがここにある方法が正しいと思う。ダブル*はトリッキーです。 –

関連する問題