学校のプロジェクトでは、リンクされたリスト構造のみを使用して 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
この場合、割り当てが機能しない理由について誰かが考えていますか? これは現在私のプロジェクト全体を台無しにしているので、どんな洞察も大歓迎です。ありがとうございました!!!