【问题标题】:Segmentation fault on recursion function c++递归函数c ++上的分段错误
【发布时间】:2019-08-13 02:54:03
【问题描述】:

我正在研究预购遍历二叉树算法。但是我遇到了 Segmentation fault: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;
}

【问题讨论】:

  • malloc 不会为您清零内存。这意味着,Node malloc-ed 可能左右非 NULL,因此您的 preorder() 将错误地遍历到无效的内存位置。当您使用 C++ 时,为什么不为您的类编写一个构造函数并使用new,而不是使用malloc
  • 两个答案都指出了原因。以后可以在这里进行自我诊断:segfault.stensal.com/a/e4e7lMyfNQ62slZH

标签: c++ pointers recursion binary-tree


【解决方案1】:

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


无论如何,如果您使用 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());
}

【讨论】:

  • 很抱歉,但这不是简单的c++11??
  • 处于有利位置,能够始终使用最新功能。我忘记了版本。你的答案=)
【解决方案2】:

问题是你的左右子节点没有初始化为NULL。由于存储在该内存位置的先前值,程序在您的 if(T!=nullptr) 语句中遇到非空值并执行 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;
}

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2014-11-05
    • 2013-03-05
    • 2017-06-05
    相关资源
    最近更新 更多