gpt4 book ai didi

C 修改结构中的数组

转载 作者:行者123 更新时间:2023-12-04 11:02:38 25 4
gpt4 key购买 nike

我正在用 C 编写操作系统。我有一个使用结构的基本文件系统。我正在写一个命令行,我想要一个函数来创建一个新文件。我有一个设置,但它不起作用。该结构初始化良好,但未添加到文件夹中。每个文件都是以下文件类型的结构:

typedef struct {
char** content; // Address of the text in the file
char* name; // Filename
size_t size; // Included from stddef.h - set by the function
} file;

每个目录都是下面dir类型的结构:

typedef struct {
file* files[256]; // The files in the directory
char* name; // The directory name
size_t index; // The index of the next file - basically the length of the files array - starts at 0
} dir;

我的new_file函数如下:

void new(dir* folder, char* name, char* content) { 
// Folder is a dir* so we can modify the actual struct, not a copy
file f;
f.name = name;
f.content = &content;
folder -> files[folder -> index] = &f;
folder -> index++;
}

我是 C 的初学者,但我不知道问题出在哪里。请帮忙!

更多信息

函数(基本上):

void new(char* name, char* content, dir* folder) {
file new = new_file(name, content);
add_file(folder, new);
}

add_file 函数:

void add_file(dir* folder, file f) {
folder -> files[folder -> dirnum] = f;
folder -> dirnum++;
}

我调用来尝试读取文件的函数:

char* read(dir* folder, char* name) {
file f = find_file(*folder, name);
return f.content;
}

find_file 为:

file find_file(folder, name) {
for (size_t i = 0; i < folder.filenum; i++) {
file f = *folder.files[i];
if (strcmp(f.name, name, '\0')) {
return f;
}
}
}

strcmp 是我写的一个字符串比较函数。
对源码进行一些修改后,出现如下bug。运行时(在命令行中):

new hi file // Same as new("hi", "file", &root)
open hi // Same as read(&root, "hi")

输出是open hi

当我运行 new 函数时,folder.files[0] 存在。但是,folder.files[0] -> name 等于 g→。知道为什么吗?

最佳答案

问题是

void new(dir* folder, char* name, char* content) { 
// Folder is a dir* so we can modify the actual struct, not a copy
file f;
.......
folder -> files[folder -> index] = &f;

这里的 f 在局部变量中。

存储地址不是明智之举。

或者你可以做这两件事之一

  1. 最简单的是声明全局文件数组并使用它们。//只是为了测试它非常糟糕的想法,但很容易检查这是否解决了问题。
  2. 正确的做法是使用 malloc 之类的方法分配内存,并在删除时释放它。

在实际的文件系统中,这个列表保存在磁盘上。引用最简单的文件系统来研究,即 FAT16

我用过chans FATFS执行。这很容易理解。并有据可查。

关于C 修改结构中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58701575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com