递归函数上的分割故障C

Segmentation fault on recursion function c++

本文关键字:故障 分割 递归函数      更新时间:2023-10-16

i正在研究预购遍历二进制树算法。但是我遇到了细分故障:11错误。这些代码如下所示。

我想知道为什么会发生此错误。顺便说一句,我尝试了非回归算法preorder(),仍会发生分割故障。

环境:macos,clang-800.0.38

struct Node{
    char val;
    Node* left;
    Node* right;
};
void preorder(Node *T){
    if(T!=NULL){
        cout << T->val;
        preorder(T->left);
        preorder(T->right);
    }
}
int main(){
    Node *T = (Node *)malloc(sizeof(Node));
    Node *p = T;
    p->val = 'A';
    p->left = (Node *)malloc(sizeof(Node));
    p->left->val = 'B';
    p->right = (Node *)malloc(sizeof(Node));
    p->right->val = 'C'; 
    preorder(T);
    return 0;
}

您需要初始化节点的leftright成员变量为null指针。


无论如何,如果使用C ,请使用C 而不是C构造。这是您的代码的模范C 14版本:

#include <iostream>
#include <memory>
struct Node{
   Node(char a) : val(a) { };
   char val;
   std::unique_ptr<Node> left, right;
};
void preorder(Node* p) {
   if (p) {
      std::cout << p->val;
      preorder(p->left.get());
      preorder(p->right.get());
   }
}
int main() {
   auto root = std::make_unique<Node>('A');
   root->left = std::make_unique<Node>('B');
   root->right = std::make_unique<Node>('C');
   preorder(root.get());
}

问题的左,右右节点均未初始化为null。由于以前存储在该内存位置中的值,该程序在您的if(T!=nullptr)语句中遇到非NULL值并执行IF块。

struct Node{
    char val;
    Node* left;
    Node* right;
};
void preorder(Node *T){
    if(T!=nullptr){
        cout << T->val;
        preorder(T->left);
        preorder(T->right);
    }
}
int main(){
    Node *T = (Node *)malloc(sizeof(Node));
    Node *p = T;
    p->val = 'A';
    p->left = (Node *)malloc(sizeof(Node));
    p->left->val = 'B';
    p->left->left = nullptr;   //Initialize to NULL
    p->left->right = nullptr;  //Initialize to NULL
    p->right = (Node *)malloc(sizeof(Node));
    p->right->val = 'C'; 
    p->right->left = nullptr;  //Initialize to NULL
    p->right->right = nullptr; //Initialize to NULL
    preorder(T);
    return 0;
}