【发布时间】:2021-07-07 16:18:42
【问题描述】:
我有点困惑。我把它缩小到:
为什么会有这条线:
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;
}
【问题讨论】:
-
为什么在 C++ 中使用 malloc?
-
只是测试,我可以不用它,因为 struct Node 有构造函数。
-
所以,这有什么不寻常的地方,你应该初始化 all 声明的指针是安全的,即
Node *root = NULL, *rootSafe = NULL;。顺便说一句,这是 C 代码,而不是 C++。 C++ 使用nullptr而不是NULL。 -
未初始化的变量保留其内存单元中的任何值,这使得 *root 在错误情况下具有值。
-
我明白了,我犯了几个错误。感谢 sklott 的指正!
标签: c++ pointers compiler-errors segmentation-fault