2

学校のプロジェクトでは、リンクされたリスト構造のみを使用して UNIX ファイルシステムの簡略化されたバージョンを実装することになっています。現在、ファイルシステムを単純に初期化するはずの mkfs() 関数に問題があります。

私が使用している構造を作成するヘッダー ファイルは次のとおりです。

typedef struct Lines {
  char line[82];
  struct Lines *next;
} Lines;

typedef struct Node {
  char *name;
  int id;
  struct Node *parent;
  struct Node *next;
  union {
    char line[82];
    struct Node *children;
  } contents;
} Node;

typedef struct Filesystem {
  char  *name;
  struct Node *root;
  struct Node *current;
} Filesystem;

これは、このヘッダー ファイルを #include する別のファイルのメソッドです。

void mkfs(Filesystem *files) {
  Node *root = NULL; /* Creates a pointer to the directory we will use as
                      * the root directory for this filesystem*/

  files = (Filesystem *)malloc(sizeof(*files)); /* Allocates space for the the 
                             * filesystem structure */

  if(files == NULL){ /* If there is no memory available, prints error message
                      * and does nothing else */

    printf("Memory allocation failed!\n");

   } else {

    root = (Node *)malloc(sizeof(*root)); /* Allocates space for the root 
                   * directory of the filesystem. */


    if(root == NULL) { /* If there is no memory available, prints error
        * message and frees memory obtained thus far, but then 
        * does nothing else */

      printf("Memory allocation failed!\n");
      free(files);

    } else {

  /* Allocates space for the root directory's name string */
      root->name= (char *)malloc(sizeof(char)*(strlen("/")+1));

      if(root->name == NULL) { /* If there is no memory available, prints error
            * message and frees memory obtained thus far, 
            * but then does nothing else */

    printf("Memory allocation failed!\n");

    free(files);
    free(root);

      } else {

    root->name = "/"; /* Defines the root directory as being named by the
           * forward slash */ /* DO STR CPY HERE ITS CHANGING THE ADDRESS */
    root->contents.children = NULL;
    root->next = NULL;
    root->parent = NULL; /* UHH CHECK ON THIS NOOO CLUE IF ITS RIGHT FUUU*/

    files->root = root; /* The filesystems pointer to a directory is set 
             * to point to the root directory we just allocated
             * space for and set up */

    files->current = root; /* Sets the filesystems current directory to
            * point to the root directory as well, because 
            * it is the only directory in existence for this
            * filesystem at this point. */
      }
    }
  }
}

私が抱えている問題は、gdb を実行して各行をステップ実行すると、最後の 2 つの割り当て行が file->root と file->current の内容を変更していないことです。たとえば、ここでは files->root の内容を出力し、files->root = root という行を実行してから再度出力しますが、アドレスが変更されていないことがわかります。ただし、ルートを割り当てようとしているだけを印刷すると、ファイル->ルートが設定されているべき値が明らかに異なります。

(gdb) print files->root
$12 = (struct Node *) 0x400660
(gdb) step
(gdb) print files->root
$13 = (struct Node *) 0x400660
(gdb) print root
$14 = (Node *) 0x602030

この場合、割り当てが機能しない理由について誰かが考えていますか? これは現在私のプロジェクト全体を台無しにしているので、どんな洞察も大歓迎です。ありがとうございました!!!

4

1 に答える 1