簡體   English   中英

聲明一個包含指向該類型結構的指針數組的結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM