[英]Segmentation fault(core dumped) in CPP
我有点困惑。 我把它缩小到:
为什么有这条线:
Node *root, *rootSafe = NULL;
给出错误:
Segmentation fault(core dumped)
虽然只是像下面这样切换它:
Node *rootSafe, *root = NULL;
运行完美。
这是代码,你可以测试。
#include <iostream>
using namespace std;
struct Node{
int data;
Node *left, *right;
Node(int d){
this->data = d;
this->left = this->right = NULL;
}
};
Node *newNode(int d){
Node *temp = (Node *)malloc(sizeof(Node));
temp->data = d;
temp->left = temp->right = NULL;
return temp;
}
void printInorder(Node *root){
if(root == NULL){
return;
}
else{
printInorder(root->left);
cout << "--" << root->data;
printInorder(root->right);
}
}
int main()
{
//cout << "Hello World";
Node *rootSafe, *root = NULL;
int arr[] = {5, 3, 1, 4, 6};
int sizeArr = sizeof(arr)/sizeof(arr[0]);
for(auto i = 0; i < sizeArr; i++){
if(root == NULL){
rootSafe = newNode(arr[i]);
root = rootSafe;
}
else{
while(root != NULL){
if(arr[i] < root->data){//Move left
if(root->left == NULL){
root->left = newNode(arr[i]);
root = NULL;
}
else{
root = root->left;
}
}
else{//Move right
if(root->right == NULL){
root->right = newNode(arr[i]);
root = NULL;
}
else{
root = root->right;
}
}
}
}
root = rootSafe;
}
cout << "\n Print Inorder: ----"; printInorder(rootSafe);
return 0;
}
在不摆弄您的代码的情况下,我认为:
Node *root, *rootSafe = NULL;
不做你认为它做的事。 你认为它同时设置为 NULL 吗? 它没有。 root 得到一些随机值,rootSafe 得到 NULL。
这可能是您真正想要的:
Node *root = NULL, *rootSafe = NULL;
坦率地说,我个人讨厌(并且在某些工作场所违反编码约定)在同一行指定多个变量。 你不会在我的代码中找到这个。 相反,您会看到:
Node * root = nullptr;
Node * rootSafe = nullptr;
另请注意,在现代 C++ 中,NULL 不是指针。 养成使用 nullptr 的习惯。
你在这里使用root
:
if(root == NULL){
您的原始声明
Node *root, *rootSafe = NULL;
不初始化root
,留下不确定的值。 因此,具有一些随机无效值的root
可能会被取消引用,并可能导致分段错误。
为避免这种情况,您应该在使用它之前初始化root
。
它可以在声明中完成:
Node *root = NULL, *rootSafe = NULL;
或者在循环之前:
root = NULL;
for(auto i = 0; i < sizeArr; i++){
Node *root, *rootSafe = NULL;
Node *rootSafe, *root = NULL;
第一行未初始化 root。 这会在访问 root 时导致未定义的行为。
第二行未初始化 rootSafe 但 var 后来初始化rootSafe = newNode(arr[i]);
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.