C 使用列表的Shell模拟
现在我正在学习C,我的内存分配有问题,至少我从我的代码错误中了解到了这一点 代码 在联系中,您错过了设置为空的字段next和rev 在mkdir中,您没有将字段files和dir设置为NULL,有时甚至没有设置为next 为了简化代码并使其健壮,我建议您为每个结构添加一个构造函数,在值未知时执行malloc并初始化所有字段(包括NULL),还为每个结构添加一个析构函数以释放所有分配的元素。当然,在您的情况下,您也可以使用calloc而不是malloc将所有设置为0 deleteroot不会释放内存,因为在调用free之前,您将root设置为NULL,并且因为您没有按照链接释放链接资源 在rmdir中,在for内部调用free之前,您有相同的意外赋值为NULL。在结束时,如果检查它是否为NULL是无用的,因为for的继续测试就是它!=NULL,并且最后一个块中的空闲值无效 内存泄漏,因为您从未释放资源,所以在mkdir中也会引入内存泄漏 必须删除前两行 在 strlenDirectory无效,必须为C 使用列表的Shell模拟,c,memory,heap,C,Memory,Heap,现在我正在学习C,我的内存分配有问题,至少我从我的代码错误中了解到了这一点 代码 在联系中,您错过了设置为空的字段next和rev 在mkdir中,您没有将字段files和dir设置为NULL,有时甚至没有设置为next 为了简化代码并使其健壮,我建议您为每个结构添加一个构造函数,在值未知时执行malloc并初始化所有字段(包括NULL),还为每个结构添加一个析构函数以释放所有分配的元素。当然,在您的情况下,您也可以使用calloc而不是malloc将所有设置为0 deleteroot不会释放内
new->newdir = (Directory *) malloc(sizeof(Directory));
在pwd中,你是这样做的
因为前两行没有用
此外,如果是root,则不打印任何内容,可以是:
void pwd(Directory *dir)
{
if (dir->parentDir != NULL) {
pwd(dir->parentDir);
printf("%s/", dir->name);
}
else
putchar('/');
}
在cd中,必须删除对free的调用
万一。。如果有一个父级,则总是会考虑一个错误,因为您考虑子目录。请注意,在根级别有一张cd。。什么都不做,所以要替换
借
我建议您将字段newfile重命名为file,将newdir重命名为dir,因为新字段没有任何原因
在树中,必须删除对free的调用
很明显,所有内容都在头文件中,我建议您只在头文件中放置结构定义和函数声明,并将函数定义移动到源文件中,否则,如果您多次包含头文件,则会多次定义函数?以双下划线开头的标识符和以单下划线和大写字母开头的标识符是保留的,不应使用:所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。我正在使用您提供的说明。希望能得到更多的工作。我将很快在这里更新代码。谢谢你的支持。
parent->dirs->first = (NodeDir *) malloc(sizeof(NodeDir));
parent->dirs->last = (NodeDir *) malloc(sizeof(NodeDir));
parent->dirs->first = new;
parent->dirs->last = new;
new->newdir = (Directory *) malloc(strlen(Directory) + 1);
new->newdir = (Directory *) malloc(sizeof(Directory));
if (dir->parentDir == NULL)
return;
if (dir->parentDir != NULL) {
void pwd(Directory *dir)
{
if (dir->parentDir != NULL) {
pwd(dir->parentDir);
printf("%s/", dir->name);
}
else
putchar('/');
}
if (strcmp(where, "..") == 0 && dir->parentDir != NULL) {
return dir->parentDir;
} else if (dir->dirs == NULL)
if (strcmp(where, "..") == 0) {
return (dir->parentDir != NULL) ? dir->parentDir : dir;
} else if (dir->dirs == NULL)