指针混乱

时间:2014-02-21 01:01:59

标签: c++ pointers

我对指针的工作原理感到困惑。我在这个类中有一个名为PrefixTree的类和一个名为TreeNode的结构。我有以下代码来构建一个带有字符串的树,问题是每次调用preorder()它都没有正确返回根字符,之后它会抛出一个分段错误。

我想知道我是否正确设置了root指针,或者我是否在其他文件中滥用它。

//prefixtree.cpp
PrefixTree::TreeNode* PrefixTree::buildTree(string& input)
{
  char c = input[0];
  input.erase(0,1);

  TreeNode* node = new TreeNode();
  node->character = c;

  if (!root)
    root = node;

  if (c == '*')
  {
    node->left  = buildTree(input);
    node->right = buildTree(input);
  }

  return node;
}

void PrefixTree::preorder()
{
  traverse(root);
}

void PrefixTree::traverse(TreeNode* node)
{
  if (node)
  {
    cout << node->character << endl;
    traverse(node->left);
    traverse(node->right);
  }
}

//prefixtree.h

class PrefixTree
{
  private:
    struct TreeNode 
    { 
      char character; 
      TreeNode* left; 
      TreeNode* right; 
    };

    TreeNode* root; 

    void traverse(TreeNode* node);

  public:
    TreeNode* buildTree(string& input);
    void preorder();
};

//main.cpp
PrefixTree tree;
string a = string("*a**!*dc*rb");
cout << tree.buildTree(a)->character << endl;

tree.preorder();

1 个答案:

答案 0 :(得分:1)

您需要初始化指针成员,它们不会自动初始化并且可能包含垃圾值而不是nullptr,这会导致您的测试if(!root)if(node)无效,报告未初始化指针有效,然后您将取消引用。

添加构造函数:

class PrefixTree
{
private:
    struct TreeNode 
    { 
        char character; 
        TreeNode* left; 
        TreeNode* right;

        TreeNode() : character('a'), left(nullptr), right(nullptr) {};
    };

    TreeNode* root; 

    void traverse(TreeNode* node);

public:
    PrefixTree() : root(nullptr) {};

    TreeNode* buildTree(string& input);
    void preorder();
};