В коснитесь , которое вы пропустили, чтобы установить в NULL поля далее и rev
В MKDIR , которые вы пропустили чтобы установить в NULL поля файлы и dirs , а иногда next
Чтобы упростить ваш код и сделать его надежным, я призываю вас добавить для каждого struct конструктор выполняет mallo c и инициализирует все поля, включая NULL, когда значение еще не известно, а также добавляет деструктор для каждого, чтобы освободить все выделенные элемент. Конечно, в вашем случае вы также можете использовать callo c вместо mallo c, чтобы установить все в 0
delete root не освобождает память, потому что вы установили root в NULL, прежде чем вызывать free , и потому что вы не переходите по ссылкам на бесплатные связанные ресурсы.
В rmdir у вас есть такое же неожиданное назначение NULL, прежде чем вызвать free внутри для . В конце, если бесполезно проверять, является ли это НЕДЕЙСТВИТЕЛЬНЫМ, потому что тест продолжения для равен it! = NULL и free в последнем блоке бесполезно
Из-за утечек памяти, поскольку вы никогда не освобождаете ресурсы, вы также вносите утечки памяти в mkdir , делая
parent->dirs->first = (NodeDir *) malloc(sizeof(NodeDir));
parent->dirs->last = (NodeDir *) malloc(sizeof(NodeDir));
parent->dirs->first = new;
parent->dirs->last = new;
две первые строки должны быть удалены
In
new->newdir = (Directory *) malloc(strlen(Directory) + 1);
strlen (Directory) недействительно, должно быть
new->newdir = (Directory *) malloc(sizeof(Directory));
В pwd вы делаете
if (dir->parentDir == NULL)
return;
if (dir->parentDir != NULL) {
, поскольку две первые строки бесполезны
Более того вы ничего не печатаете в случае root, может быть:
void pwd(Directory *dir)
{
if (dir->parentDir != NULL) {
pwd(dir->parentDir);
printf("%s/", dir->name);
}
else
putchar('/');
}
In cd вызов free must быть удаленным
В случае ... если есть родитель, вы всегда будете указывать ошибку, потому что вы рассматриваете вложенные каталоги. Обратите внимание, что на уровне root cd .. ничего не делает, поэтому замените
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)
Я рекомендую переименовать поле newfile в file и newdir в dir , поскольку new без причины
В дереве должен быть удален вызов free
Видимо все находится в заголовочном файле Я рекомендую вам помещать только определения struct и объявления функций в файл заголовка и перемещать определения функций в исходный файл, иначе, если вы # включите несколько раз в свой заголовок файл, который вы будете иметь функции, кратно определенные