###自己参照型構造体の配列は可能か?
自身と同じ型を持つ構造体同士を
繋ぎ合わせるために必要なのが
自己参照型構造体ですが、
それを宣言する際についての質問です。
該当のソースコード
typedef struct node { int ID; struct node*Link[ ]; }NODE;
????上記のように、自己参照型構造体を**「配列」**として宣言するのは規格に反するのでしょうか?
試したこと
とりあえず上記のように宣言した上で
作業を進め、コンパイルを実行すると何も起きずそのままプログラムが終了します。(エラーメッセージなし)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/01 16:43
回答4件
0
[]
の中に配列の要素数を書けば問題ないです。
構造体の末尾のメンバーの場合は、要素数を書かない[]
のままでも文法的にはOKですが、可変配列メンバーとなり、NODE
へのポインターを宣言してmalloc
で必要サイズを割り当てるという使い方になります。
投稿2021/11/01 16:05
総合スコア85901
0
要素数不定(0)の配列が構造体メンバの最後にひとつだけであれば(ちゃんと書けば)無問題。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct node { 5 int ID; 6 int size; 7 struct node* Link[0]; 8} NODE; 9 10NODE* allocate(int id, int size) { 11 NODE* ptr = (NODE*)malloc(sizeof(NODE)+sizeof(NODE*)*size); 12 if ( ptr ) { 13 ptr->ID = id; 14 ptr->size = size; 15 for ( int i = 0; i < size; ++i ) ptr->Link[i] = NULL; 16 } 17 return ptr; 18} 19 20void print(const NODE* node) { 21 printf("ID:%d Link:", node->ID); 22 for ( int i = 0; i < node->size; ++i ) { 23 printf("%p ", node->Link[i]); 24 } 25 printf("\n"); 26} 27 28int main() { 29 NODE* p = allocate(123, 4); 30 print(p); 31 free(p); 32 return 0; 33}
投稿2021/11/01 16:02
編集2021/11/01 16:03総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/01 16:30
2021/11/01 21:08
2021/11/04 15:10
2021/11/04 17:17
0
ベストアンサー
配列サイズが固定ではないなら、構造体の定義ではサイズが決まらないといけないので、0サイズの配列として定義するか、ポインタの配列を動的に確保します。
配列サイズのメンバーを足す必要もあるでしょうね。
c
1typedef struct node { 2 int ID; 3 struct node* Link[0]; 4} NODE; 5 6// 配列がN要素のときの確保 7NODE* p = (NODE*)malloc(sizeof(NODE) + sizeof(NODE*) * N);
c
1typedef struct node { 2 int ID; 3 struct node** Link; 4} NODE; 5 6// 配列がN要素のときの確保 7NODE* p = (NODE*)malloc(sizeof(NODE)); 8p->Link = (NODE**)malloc(sizeof(NODE*) * N);
投稿2021/11/01 15:36
編集2021/11/01 16:10総合スコア21695
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/01 15:56
2021/11/01 16:00
2021/11/01 16:21
2021/11/04 15:13
0
自己回答ではなく、回答予想になっていたため削除しました。
投稿2021/11/01 15:29
編集2021/11/01 16:48総合スコア38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。