C语言目录文件存储链表偶发段错误与内存泄漏问题咨询
问题原因分析
偶现段错误的核心原因
- 主函数中
struct node *head未初始化,属于野指针。初始状态下链表为空时head应当赋值为NULL,否则第一次调用add_list时访问*head是访问随机内存地址,行为不可预测,因此段错误不是必现。 free_list和print_list没有做空指针判断:如果链表为空(head为NULL),函数一上来就访问current->next/head->next会直接触发空指针访问崩溃。strncpy未保证字符串结尾:strncpy(new_node.filename, de->d_name, FILENAME_MAX)如果文件名长度等于FILENAME_MAX,不会自动在末尾补\0,后续打印filename时会发生数组越界,触发段错误。fill_list遍历完目录后未调用closedir(dir)释放目录流资源,属于资源泄漏,极端情况下打开文件描述符占满也会引发异常。- 调用
stat未判断返回值:如果stat执行失败,st结构体内容为未定义的垃圾值,存在潜在的访问异常风险。
内存泄漏的核心原因
free_list的遍历逻辑错误:循环条件为current->next != NULL,只会释放除最后一个节点之外的所有节点,最后一个next为NULL的节点永远不会被free,导致固定的内存泄漏。- 上述提到的目录流未关闭也属于资源泄漏的一种。
其他逻辑错误
print_list遍历逻辑错误:循环条件为head->next,最后一个节点永远不会被打印。add_list存在冗余代码:先执行new->next = NULL,紧接着又赋值new->next = *head,第一行赋值无意义。- 多个函数声明不符合C规范:
fill_list声明返回int但无返回值,free_list未声明返回值类型(C89下默认返回int,C99及以后标准不允许该写法),print_list声明返回int但无返回值。
内容的提问来源于stack exchange,提问作者senya247
相关产品推荐
相关产品推荐

