输入(3 25 NULL)时普通树转二叉树程序异常退出,求故障原因
普通树转二叉树程序输入特定测试用例时异常退出的排查思路
问题场景
我写了一个完成普通树转二叉树+先序遍历打印的C语言课程作业程序。用下面的测试输入时,程序刚处理到(3 25 NULL)就异常退出了:
(1 100 200) (2 200 NULL) (2 75 25) (2 300 NULL) (3 25 NULL) (3 50 NULL) (3 30 120) (3 150 NULL) (4 120 NULL) (4 55 NULL)
程序预期输出是:
100 200 75 300 25 50 30 120 55 150
可能的崩溃原因
- 父节点查找失败导致空指针访问:处理
(3 25 NULL)时需要找到值为25的父节点。如果查找函数逻辑有问题(比如遍历二叉树时漏判空指针、未正确匹配父节点值),会直接访问空指针触发崩溃。比如之前创建25节点的步骤出错,导致查找时返回NULL,后续直接用这个指针操作节点成员就会崩。 - 内存操作违规:如果创建节点时内存分配失败没做处理,或者之前的代码有重复释放内存的情况,处理到这条测试用例时刚好触发非法内存访问。
- 二叉树转换逻辑错误:普通树转二叉树遵循「左孩子右兄弟」规则,要是转换时没维护好兄弟节点的指针链(比如25节点的兄弟指针指向了错误地址),操作时就会访问非法内存。
- 输入解析bug:解析
NULL时逻辑出错,比如把字符串"NULL"强行转成整数,导致父节点匹配错误;或者没正确识别NULL代表无子节点,错误创建了无效节点。
排查步骤
- 加调试打印:在查找父节点、创建节点、赋值指针的关键位置加打印,输出当前操作的节点值、指针地址,确认处理
(3 25 NULL)时,父节点25是否被正确找到,指针是不是非空。 - 检查空指针判断:把所有用
->访问节点成员的代码过一遍,确保每一步都先判断指针不为NULL再操作。比如查找父节点的函数返回后,必须先判断是否找到,再进行后续的子节点/兄弟节点赋值。 - 单独测试输入解析:把输入解析模块抽出来单独跑,验证解析
(3 25 NULL)时,是否正确识别父节点是25,且子节点为「无」(也就是不需要创建子节点),没有把NULL转成奇怪的数值。 - 用调试工具定位:用GDB调试程序,崩溃后用
backtrace看调用栈,直接找到崩溃的代码行。比如启动GDB后输入run运行程序,崩溃后输入bt就能看到哪一行代码出的问题,是访问空指针还是内存越界。
内容的提问来源于stack exchange,提问作者JangEunSeong
相关产品推荐
相关产品推荐

