终端出现Segmentation Fault:字符串转二叉树代码故障排查
代码段错误(Segmentation Fault)原因排查及修复
以下是导致代码出现段错误的核心问题及对应修复方式:
初始指针未初始化就传入函数
在treeFromString函数中,你定义了Node * p但未分配内存就直接传给create函数。此时p是野指针,create函数中对root->data的赋值操作会访问非法内存,直接触发段错误。
修复:先为根节点分配内存再传入:Node * treeFromString(string str){ Node * p = new Node(); // 先创建节点 p = create(p, 0, str.size() - 1, str); return p; }递归调用时传入未初始化的子节点指针
当执行create(root->left, i + 1, j - 1, str)时,root->left默认是NULL(未分配内存),进入create函数后操作root->data会访问空指针,导致段错误。
修复:在create函数开头检查root是否为空,为空则分配内存:Node * create(Node * root, int I, int J, string str) { if (!root) root = new Node(); // 新增:如果root为空则创建节点 // 后续原有代码 }I == J分支未提前返回,后续代码非法执行
当I == J时,你给当前节点赋值后没有return,函数会继续执行后面的解析、栈操作等代码。此时val是空字符串,调用stoi(val)会抛出异常,且后续对指针的操作也会访问非法内存。
修复:在I == J的分支末尾添加return root;:if (I == J) { root -> data = str[I]; root -> left = NULL; root -> right = NULL; return root; // 提前返回,避免执行后续代码 }直接访问未初始化的子节点指针成员
当j - i == 2时,你直接执行root -> left -> data = str[i + 1];,但root->left此时是NULL,访问其data成员会触发段错误。
修复:先创建root->left节点再赋值:if (j - i == 2) { root->left = new Node(); // 先创建左子节点 root->left->data = str[i + 1]; root->left->left = NULL; root->left->right = NULL; }同理,处理右子节点的
l - k == 2分支也要做同样的修改。
内容的提问来源于stack exchange,提问作者Arjun Singh
相关产品推荐
相关产品推荐

