2017-08-10 115 views

回答

1

不,你不能做到这一点,你需要做的是:

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个子文件夹。

-1

简短的回答是肯定的,这种效果会起作用。您可能需要添加一个struct folder parentfolder,以便您可以向上或向下导航。

+0

我预测downvotes这个答案....不能够向上导航不是问题在这里。 –

+0

同意@MichaelWalz。你混淆了结构和指向结构的指针(后者是允许的) – JeremyP

4

不,不可能为struct类型包含相同类型的数组(因为类型通常会被诊断为不完整)。此外,如果该类型的每个变量都包含一个或多个相同类型的成员,那么类型定义将是无限递归的(一个包含A的A包含A ......)。

然而,struct类型可以包含一个指针

struct folder1 
{ 
    char* name; 
    struct folder1 *a_subfolder; 
}; 

或指针数组

struct folder2 
{ 
    char* name; 
    struct folder2 *subfolders [10]; 
}; 

在两种情况下,其使用论文类型需要照顾以确保指针是代码初始化正确,并且它们是合理的(例如,不试图访问未初始化的指针的值,而不是取消引用NULL等)。在使用这种构造之前阅读指针 - 使用指针来弄错事情通常意味着一个程序以可怕的方式崩溃。

+0

我同意你将得到的诊断是“不完整类型”,但*原因*是这样的类型会导致无限的回归,并且如果除了自身的实例外还有其他内容,还需要无限存储。 – JeremyP

0
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); 
    } 
}