在结构内部,如何定义与结构本身具有相同类型的结构的数组(动态)

时间:2010-08-17 01:02:22

标签: c arrays dynamic structure

目标是使用动态数组构建“无限”树。

items[3]
- MENUITEM
  - items[2]
    - MENUITEM
      -items[0]
    - MENUITEM
      - items[0]
- MENUITEM
  - items[0]
- MENUITEM
  - items[2]
    - MENUITEM
      - items[0]
    - MENUITEM
      - items[0]

我定义了结构:

typedef struct MENUITEM {
    char id, count;
    char *description;
};

我可以动态分配项目:

char count;
MENUITEM items[], *items_ptr;

count++;
realloc( items_ptr, count * sizeof(struct MENUITEM) );

问题是在结构内部我无法再次分配结构本身,如:

typedef struct MENUITEM {
    char id, count;
    char *description;

    MENUITEM items[], *items_ptr;
};

编译器输出:错误:字段'items'的类型不完整;我在这做错了什么? 感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您需要使用struct MENUITEM *items_ptr;。请注意使用单词struct

为什么你有MENUITEM items[]?它不用于任何东西。

请改为:

typedef struct MENUITEM {
    char id, count;
    char *description;

    struct MENUITEM *items;
} MENUITEM;

void foo() {
    MENUITEM *root = (MENUITEM*)malloc(sizeof(MENUITEM));

    root->id = 87;
    root->count = 5;

    root->items = (MENUITEM*)malloc(sizeof(MENUITEM)*root->count);
}

答案 1 :(得分:0)

更改MenuItem结构以保存指向MENUITEM

的指针
typedef struct MENUITEM {
    char id, count;
    char *description;

    MENUITEM *items_ptr;
};

不仅如此,分配也不好 - 这样做会慢很多

count++;
realloc( items_ptr, count * sizeof(struct MENUITEM) );

你最好分配一块内存,比如容纳50个条目,当达到限制时,realloc它的块大小是两倍,请确保你不要破坏这样的结果:< / p>

正确:

MENUITEM *temp_items_ptr;
temp_items_ptr = realloc( items_ptr, count * sizeof(struct MENUITEM) );
if (temp_items_ptr != NULL){
   items_ptr = temp_items_ptr;
}else{
   /* Handle the out of memory situtation */
}

错:

items_ptr = realloc( items_ptr, count * sizeof(struct MENUITEM) );

错误的做法是灾难的一种方法,并向泄露的记忆问好!