目标是使用动态数组构建“无限”树。
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'的类型不完整;我在这做错了什么? 感谢您提供的任何帮助。
答案 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) );
错误的做法是灾难的一种方法,并向泄露的记忆问好!