【发布时间】: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) 我该如何解决这个错误。
【问题讨论】:
-
struct Node *root; ... root->data = data;当您分配给root->data时,您认为root指向哪里? (if (node == NULL){node->data = val; ...}中的node也是如此)我建议你阅读一本好的 C++ 书籍或至少一些关于指针的教程。 -
能否请您帮我理解@HolyBlackCat 出了什么问题,而不是典型的“读书”响应。
-
一本好书会比我解释得更好。简而言之,一个指针必须指向一个实际的对象,才能对
*pointer和pointer->something进行读写。
标签: c++ pointers segmentation-fault binary-tree binary-search-tree