缘由
如果你看懂了我的上一篇关于ls -r命令简单实现的文章后,一定会发现上一篇文章中的程序有着巨大的缺陷,因为在上一篇文章的程序中,程序执行结束后,我并没有释放存储文件和文件夹名的动态内存分配的空间,这篇是对我上一篇文章的补充,不仅修复了缺陷,而且加入了能输出 . 和 . . 文件夹名的功能,同样, . 和 . . 文件夹名我并没有存储。
// lsr.h
void file_info_list_clear(file_info_list*); // 放入lsr.h头文件中
// lsr.c
void print(file_info_list *beg, int num) // 修改后的print函数
{
for (int i = 0; i < num; ++i) // 加入了这6行代码
printf("\t");
printf(".\n");
for (int i = 0; i < num; ++i)
printf("\t");
printf("..\n");
while (beg != NULL) {
for (int i = 0; i < num; ++i)
printf("\t");
printf("%s", beg->name);
if (beg->dir != NULL) {
printf(" :\n");
print(beg->dir, num+1);
} else {
printf("\n");
}
beg = beg->file;
}
return;
}
void clear(void) // clear函数修改后
{
while (begin != NULL) {
#ifdef TEST
printf("path space free : %s\n", begin->ptr);
#endif
need_free_list *net = begin->next;
free(begin->ptr);
free(begin);
begin = net;
}
file_info_list_clear(head.dir); // 加入了对file_info_list_clear函数的调用
return;
}
void file_info_list_clear(file_info_list *beg) // 递归函数 目的是释放为了存储文件和文件夹名
{ // 而动态内存分配的空间
while (beg != NULL) {
if (beg->dir != NULL)
file_info_list_clear(beg->dir);
file_info_list *next = beg->file;
#ifdef TEST
printf("%s : clear!\n", beg->name); // 测试代码 确定内存正确释放
#endif
free(beg->name);
free(beg);
beg = next;
}
return;
}