尝试实现 BST 时 C++ 中的分段错误(核心转储)
Segmentation fault (core dumped) in C++ while trying to implement a BST
我正在尝试使用链表创建 BST。我试图在适当的时候向左或向右遍历我的树,直到找到一个空值,然后我尝试创建一个节点并在该位置给出一个值。
现在我收到错误
Segmentation fault (core dumped)
来自此代码(逻辑可能不正确,因为这是一项正在进行的工作)
#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 << " ";
}
样本输出
number of nodes 5
data 12
left 12 12
Segmentation fault (core dumped)
我想知道的是
1) 我经常遇到这个错误,该如何调试。我在 Ubuntu 中使用 VS Code,使用它附带的默认编译器和 Microsoft 的 C/C++ 扩展,但是当我附加断点时,我只得到调用堆栈。我该如何设置才能像 java 程序一样逐步完成。
2) 我怎样才能使 C++ 打印出有意义的错误消息,而不仅仅是段错误消息。例如,我想知道程序中的哪一行出错了(尽管在这个例子中很明显)。
3) 我该如何修复这个错误。
我已阅读xkcd meme and the What is a segmentation fault?
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);
我正在尝试使用链表创建 BST。我试图在适当的时候向左或向右遍历我的树,直到找到一个空值,然后我尝试创建一个节点并在该位置给出一个值。
现在我收到错误
Segmentation fault (core dumped)
来自此代码(逻辑可能不正确,因为这是一项正在进行的工作)
#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 << " ";
}
样本输出
number of nodes 5
data 12
left 12 12
Segmentation fault (core dumped)
我想知道的是
1) 我经常遇到这个错误,该如何调试。我在 Ubuntu 中使用 VS Code,使用它附带的默认编译器和 Microsoft 的 C/C++ 扩展,但是当我附加断点时,我只得到调用堆栈。我该如何设置才能像 java 程序一样逐步完成。
2) 我怎样才能使 C++ 打印出有意义的错误消息,而不仅仅是段错误消息。例如,我想知道程序中的哪一行出错了(尽管在这个例子中很明显)。
3) 我该如何修复这个错误。
我已阅读xkcd meme and the What is a segmentation fault?
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);