【问题标题】:Segmentation fault (core dumped) in C++ while trying to implement a BST尝试实现 BST 时 C++ 中的分段错误(核心转储)
【发布时间】:2019-08-11 03:00:27
【问题描述】:

我正在尝试使用链表创建 BST。我试图在适当的时候向左或向右遍历我的树,直到找到一个空值,然后我尝试创建一个节点并在该位置给出一个值。

现在我得到了错误

分段错误(核心转储)

从此代码(逻辑可能不正确,因为这是一项正在进行的工作)

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node *left, *right;
    Node(int data)
    {
        this->data = data;
        left = right = NULL;
    }
};
void traverseIn(Node *node, int val);

int main()
{
    int numOfNodes;
    cout << "number of nodes ";
    cin >> numOfNodes;

    for(int i = 0;i<numOfNodes;i++){
        struct Node *root;
        int data;
        cout << "data ";
        cin >> data;
        root->data = data;
        traverseIn(root,data);
    }
}

void traverseIn(Node *node , int val){
    if (node == NULL){
        node->data = val;
        return;
    }

     //go leftdat
     if (val <= node->data) {
        cout << "\nleft " << val<<" "<< node->data;
        traverseIn(node->left,val);
     }
     else if(val > node->data){
         //go right
        cout << "\nright " << val<<" "<< node->data;
        traverseIn(node->right,val);
     }

     cout << node->data << " ";

}

样本输出

节点数 5

数据 12

左 12 12

分段错误(核心转储)

我想知道的是

1) 我如何调试这个错误,因为我经常遇到它。我在 Ubuntu 中使用 VS Code,使用它附带的默认编译器和微软的 C/C++ 扩展,但是当我附加断点时,我只得到调用堆栈。如何设置它,以便我可以像使用 java 程序一样单步执行。

2) 如何让 C++ 打印出有意义的错误消息,而不仅仅是 seg 错误消息。例如,我想知道程序中的哪一行有问题(尽管在这个例子中很明显)。

3) 我该如何解决这个错误。

我已阅读xkcd memeWhat is a segmentation fault?

【问题讨论】:

  • struct Node *root; ... root-&gt;data = data; 当您分配给root-&gt;data 时,您认为root 指向哪里? (if (node == NULL){node-&gt;data = val; ...} 中的 node 也是如此)我建议你阅读一本好的 C++ 书籍或至少一些关于指针的教程。
  • 能否请您帮我理解@HolyBlackCat 出了什么问题,而不是典型的“读书”响应。
  • 一本好书会比我解释得更好。简而言之,一个指针必须指向一个实际的对象,才能对*pointerpointer-&gt;something进行读写。

标签: c++ pointers segmentation-fault binary-tree binary-search-tree


【解决方案1】:

root 未定义。您的代码导致取消引用未定义的指针。你可以在这里试试你的代码a live test

=========== #0 stensal 运行时消息的开始 ===========

运行时错误:[解除对未定义指针的引用]
继续执行会导致未定义的行为,中止!

-
- Writing 4 bytes to an undefined address (0x0).
- 
- Stack trace (most recent call first) of the write.
- [1]  file:/prog.cc::27, 9
- [2]  [libc-start-main]
-

============#0 stensal 运行时消息结束 ============

一个简单的修复(仅用于修复段错误,而不是代码的逻辑)

root = new Node(data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2015-07-27
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2020-10-30
    相关资源
    最近更新 更多