计算森林叶子结点数量时遍历抛出读取访问冲突异常如何解决
问题根因
触发读取访问冲突的核心问题有两个:
- main函数提前为根节点预分配了多余内存:
CreateTree函数本身会根据输入动态创建节点,提前分配的内存不仅会在输入第一个有效节点时产生内存泄漏;如果第一个输入为-1(代表无对应节点),还会导致后续遍历访问到data字段未初始化的无效节点。 CreateTree未处理输入为-1的分支逻辑:当输入为-1时,代表当前位置没有节点,必须显式把传入的二重指针指向的节点指针设为NULL,否则如果传入的指针原本就是非NULL的野指针/无效指针,后续遍历访问节点成员时就会触发访问冲突。
修复方案
1. 修改main函数
去掉多余的根节点预分配逻辑,直接初始化树指针为NULL即可:
#include "AllFun.h" int main(int argc, char* argv[]) { CsNode* tree = NULL; CreateTree(&tree); if (tree != NULL) { preOrder(tree); int leaves = CountForestLeaves(tree); printf("\nleaves: %d", leaves); } return 0; }
2. 修改CreateTree函数
补充输入为-1时的指针赋值逻辑,避免野指针:
void CreateTree(CsNode** node) { int data; printf("please input data: "); scanf_s("%d", &data); if (data != -1) { *node = (CsNode*)malloc(sizeof(CsNode)); // 建议补充malloc判空逻辑,避免分配失败触发访问冲突 (*node)->data = data; (*node)->firstchild = NULL; (*node)->nextsibling = NULL; CreateTree(&(*node)->firstchild); CreateTree(&(*node)->nextsibling); } else { *node = NULL; } }
内容的提问来源于stack exchange,提问作者lanqi
相关产品推荐
相关产品推荐

