设置bool可能会出现段错误吗?

时间:2016-11-15 16:39:48

标签: c++ segmentation-fault boolean

我有一个二叉树,其节点定义为

typedef unsigned long ul;
struct Fibonacci_node{
    ul number;                              
    int n;                                 
    bool isLeaf;                            
    Fibonacci_node * left;
    Fibonacci_node * right;
  };

我想在每次插入时设置isLeaf,这样我最终可以很容易地得到叶子的总数。插入方法由公共方法 insert 组成,它调用私有递归方法 insertR

#include <iostream>
using namespace std;

class Fibonacci_tree{
    private:
        struct Fibonacci_node{
        ul number;                              // store the n-th fibonacci number
        int n;                                  // fibonacci number to compute
        bool isLeaf;                            // true if the node is leaf
        Fibonacci_node * left;
        Fibonacci_node * right;
      };



        /* definition of the root of the binary tree */
        Fibonacci_node * root;

        /* class private methods (recursively defined) */
        ul fibonacci(int n){
        /* BASE CASE */
        if (n == 0) { return 1; }
        if (n == 1) { return 1; }

        /* call the function recursively */
        return fibonacci(n - 1) + fibonacci(n - 2);
      };

      Fibonacci_node * insertR(int n, Fibonacci_node * node){
        if (!node) {
        /* if pointer is null create a new node */

        Fibonacci_node * tmp = new Fibonacci_node;
        tmp->n = n;
        tmp->number = fibonacci(tmp->n);
        tmp->left = tmp->right = 0;
        tmp->isLeaf = 0;

        /* update the pointer and return it */
        node = tmp;

        /* BASE CASE */
        if (n == 0) {
          node->isLeaf = 1;
          return node;
        }
        if (n == 1) {
          node->isLeaf = 1;
          return node;
        }
      }

      /* call the function recursively */
      node->left = insertR(n - 1, node->left);
      node->right = insertR(n - 2, node->right);

      return node;
    };

  public:
    Fibonacci_tree(){
      root = 0;
    }
    ~Fibonacci_tree(){}

    /* class public methods (they include private methods recursively defined)*/
    void insert(int n){

      /* first, create initial node and compute fibonacci for the root */
      Fibonacci_node * tmp = new Fibonacci_node;
      tmp->n = n;
      tmp->number = fibonacci(n);
      tmp->isLeaf = false;
      //getNo(tmp);

      /* make root point to the first element of the tree */
      root = tmp;

      /* then call the recursive function */
      root = insertR(n, root);
    };
};
/* END OF CLASS DECLARATION */


/* main program to check the class */
int main(void) {
  int n = 3;

  /* instantiate a Fibonacci tree */
  Fibonacci_tree fib_series;
  /* fill the tree */
  fib_series.insert(n);

  return 0;
}

当我运行我的可执行文件时,我得到了

Segmentation fault: 11

我打印了几条评论,并且我注意到错误似乎在我将“false”分配给布尔值之后立即出现。所以,我假设分配出错了,但这是我第一次在这种情况下出现分段错误。

我也认为,因为到目前为止我没有遇到任何问题,但是当我在类定义中引入这个变量时就开始了。

因为这样可能会出现分段错误,或者我可能在其他地方遇到过我尚未注意到的问题吗?

我想自己完全调试它,但我的调试技巧仍然有点糟糕。因此,我们非常感谢任何反馈。

2 个答案:

答案 0 :(得分:3)

实际问题在于:

 /* call the function recursively */
    node->left = insertR(n - 1, node->left);

此时node->left尚未初始化,您将该非原始化值递归传递到insertR,在那里检查它是否为NULL,因为它未被初始化它很可能是非空的,然后你在这里再次取消引用它:node->left = insertR(n - 1, node->left);。取消引用非初始化指针是未定义的行为。

其实你忘记在这里将leftright初始化为0:

/* first, create initial node and compute fibonacci for the root */
Fibonacci_node * tmp = new Fibonacci_node;
tmp->n = n;
tmp->number = fibonacci(n);
tmp->isLeaf = false;
tmp->left = tmp->right = 0;    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< you forgot this.
//getNo(tmp);

当你用C ++写作时,为什么不为Fibonacci_node写一个构造函数,所有的初始化都可以在一个地方完成?

tmp->isLeaf = false;导致计算机出现段错误只是未定义行为的结果。

答案 1 :(得分:1)

如果tmp不是有效指针(NULL,已经释放的东西,超出范围的东西,或者首先没有正确分配的东西),这可能是原因