You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

终端出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:20:22