C语言目录树程序递归函数调用引发段错误的问题排查
递归目录处理函数段错误原因分析
1. 未过滤特殊目录条目.和..,引发无限递归栈溢出
目录默认包含.(当前目录)和..(上级目录)两个特殊条目,代码未对这两个条目做跳过处理。递归调用时会反复处理当前目录与上级目录,造成无限递归,最终栈空间耗尽触发段错误。这是导致你看到"subdir1"打印后立刻崩溃的核心原因之一。
2. 错误释放栈上分配的数组
代码中struct dirent entries[MAX_DIR];是栈上自动分配的数组,却在函数末尾调用free(entries);。free仅允许释放堆内存(malloc/calloc等函数分配的空间),释放栈内存属于未定义行为,直接会触发段错误。
3. opendir失败后未终止函数执行
当opendir(dn)返回NULL(比如路径无效、权限不足),代码仅打印错误信息但未执行return终止函数,后续会继续使用空指针d调用getNext(d),直接触发段错误。
4. 递归调用时路径逻辑缺陷
递归调用传入的this.d_name仅为子条目名称,并非完整路径。如果程序当前工作目录与dn指向的目录不一致,opendir会找不到目标路径;即使路径暂时有效,结合未过滤.的问题,依然会陷入无限递归。
5. 未关闭目录流导致资源泄漏
打开目录后未调用closedir(d)关闭目录流,递归场景下会快速耗尽系统允许打开的文件描述符,导致后续opendir失败,间接引发错误。
内容的提问来源于stack exchange,提问作者flo
相关产品推荐
相关产品推荐

