[英]Declaring a struct containing an array of pointers to that type of struct
我正在嘗試對文件管理器進行編程,並且想使用包含子文件夾數組的文件夾。
我在想類似的東西
struct folder {
char* name;
struct folder subfolders [10];
}
有可能嗎?
不, struct
類型不可能包含相同類型的數組(因為通常會將該類型診斷為不完整)。 此外,如果該類型的每個變量都包含一個或多個相同類型的成員,則類型定義將是無限遞歸的(A包含A,而A包含A .....)。
但是, struct
類型可以包含一個指針
struct folder1
{
char* name;
struct folder1 *a_subfolder;
};
或指針數組
struct folder2
{
char* name;
struct folder2 *subfolders [10];
};
在這兩種情況下,使用這些類型的代碼都必須注意確保正確初始化了指針,並確保它們可以合理地工作(例如,不嘗試訪問未初始化的指針的值,不取消引用NULL等)。 在使用這種構造之前,請先閱讀指針-指針出錯會導致程序崩潰。
不,您不能這樣做,您需要這樣做:
struct folder {
char* name;
struct folder *subfolders [10];
}
現在, struct folder
類型的變量包含10個指向 struct folder
類型變量的指針 。
在繼續之前,您絕對需要熟悉指針和動態內存分配。
首先查看使用相似概念的鏈表和二叉樹。 網絡上有大量的示例和教程(Google“ c鏈表示例”)。
您的解決方案:
struct folder {
char* name;
struct folder subfolders [10];
}
這是沒有意義的,因為每個struct folder
將再次包含10 struct folder
,每個struct folder
將包含10 struct folder
,依此類推直到無限。
但是請注意,按照您的概念,每個文件夾最多只能包含10個子文件夾。
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);
}
}
簡短的答案是肯定的,可以達到這種效果。 您可能要添加一個struct folder parentfolder
以便可以上下導航。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.