我正在尝试编写文件管理器,并且想要使用包含子文件夹数组的文件夹。声明包含指向该类型结构的指针数组的结构体
我喜欢
struct folder {
char* name;
struct folder subfolders [10];
}
思考的东西是任何方式possbile?
我正在尝试编写文件管理器,并且想要使用包含子文件夹数组的文件夹。声明包含指向该类型结构的指针数组的结构体
我喜欢
struct folder {
char* name;
struct folder subfolders [10];
}
思考的东西是任何方式possbile?
不,你不能做到这一点,你需要做的是:
struct folder {
char* name;
struct folder *subfolders [10];
}
现在struct folder
类型的变量包含10个指针到struct folder
类型的变量。
在开始之前,您绝对需要熟悉指针和动态内存分配。
首先查看使用类似概念的链表和二叉树。网上有大量的例子和教程(谷歌“c链表例子”)。
您的解决方案:
struct folder {
char* name;
struct folder subfolders [10];
}
没有意义,因为每个struct folder
将再次含有10 struct folder
,每一个都将包含10 struct folder
依此类推,直至无穷。
但请注意,使用您的概念,每个文件夹最多只能包含10个子文件夹。
简短的回答是肯定的,这种效果会起作用。您可能需要添加一个struct folder parentfolder
,以便您可以向上或向下导航。
不,不可能为struct
类型包含相同类型的数组(因为类型通常会被诊断为不完整)。此外,如果该类型的每个变量都包含一个或多个相同类型的成员,那么类型定义将是无限递归的(一个包含A的A包含A ......)。
然而,struct
类型可以包含一个指针
struct folder1
{
char* name;
struct folder1 *a_subfolder;
};
或指针数组
struct folder2
{
char* name;
struct folder2 *subfolders [10];
};
在两种情况下,其使用论文类型需要照顾以确保指针是代码初始化正确,并且它们是合理的(例如,不试图访问未初始化的指针的值,而不是取消引用NULL等)。在使用这种构造之前阅读指针 - 使用指针来弄错事情通常意味着一个程序以可怕的方式崩溃。
我同意你将得到的诊断是“不完整类型”,但*原因*是这样的类型会导致无限的回归,并且如果除了自身的实例外还有其他内容,还需要无限存储。 – JeremyP
struct folder {
char* name;
struct folder subfolders [10]; // bad
}
是不可能每路@Peter罚款答案struct folder
需要它的完整定义之前没有完全确定。 `
这有可能以任何方式吗?
是,考虑动态分配:
让函数来创建,添加子文件夹,并删除。许多可能的改进。
typedef struct folder_s {
char* name;
size_t n;
struct folder_s **subfolder;
} folder;
folder *folder_alloc(const char *name) {
folder *root = malloc(sizeof *root);
if (root) {
root->n = 0;
root->subfolder = NULL;
root->name = strdup(name);
if (root->name) {
return root;
}
free(root);
}
return NULL;
}
folder *folder_add_subfolder(folder *f, folder *sf) {
size_t new_n = f->n + 1;
void *tmp = realloc(f->subfolder, sizeof *(f->subfolder) * new_n);
if (tmp == NULL) {
return NULL;
}
f->subfolder = tmp;
f->subfolder[f->n] = sf;
f->n = new_n;
return f;
}
// Only need to free the root folder, recursion will handle the sub-folders.
void folder_free_tree(folder *f) {
if (f) {
while (f->n > 0) {
f->n--;
folder_free_tree(f->subfolder[f->n]);
}
free(f->subfolder);
f->subfolder = NULL; // Useful for debug
free(f->name);
f->name = NULL; // Useful for debug
free(f);
}
}
我预测downvotes这个答案....不能够向上导航不是问题在这里。 –
同意@MichaelWalz。你混淆了结构和指向结构的指针(后者是允许的) – JeremyP