搜索功能导致程序崩溃

时间:2017-04-20 19:22:51

标签: c++ debugging pointers tree logic

我一直在浏览调试器,但似乎无法准确找出出错的地方。我得出了自己的结论,我必须在某处或某处错过nullptr检查。如果有人可以提供一些帮助,将不胜感激。

来自调试器的

错误消息

error msg

看起来会让程序在这一行崩溃:

if (node->children_[index] == nullptr) {

搜索功能

    Node* search(const string& word, Node* node, int index) const {
            Node* temp;
            //same as recurssive lookup just difference is returns node weather terminal or not
            if (index < word.length()) {


                            index = node->getIndex(word[index]);


                            if (node->children_[index] == nullptr) {
                                    return nullptr;
                            }
                            else {
                                    temp = search(word, node->children_[index], index++);
                            }
                    }

                    return temp; // this would give you ending node of partialWord


            }

节点结构供参考

    struct Node {
            bool isTerminal_;
            char ch_;
            Node* children_[26];
            Node(char c = '\0') {
                    isTerminal_ = false;
                    ch_ = c;
                    for (int i = 0; i < 26; i++) {
                            children_[i] = nullptr;
                    }
            }
            //given lower case alphabetic charachters ch, returns 
            //the associated index 'a' --> 0, 'b' --> 1...'z' --> 25
            int getIndex(char ch) {
                    return ch - 'a';

            }
    };
    Node* root_;


int suggest(const string& partialWord, string suggestions[]) const {

    Node* temp;

    temp = search(partialWord, root_, 0);

    int count = 0;
    suggest(partialWord, temp, suggestions, count);

    return count;
}

2 个答案:

答案 0 :(得分:0)

可能是一件非常简单的事情。如果不进行挖掘,我不确定->运算符与==运算符的等级。我会花一点时间尝试将括号括在“node->children_[index] == nullptr”部分,如下所示:

(node->children_[index]) == nullptr

只是为了确保逻辑运行就像你想要的那样。

Dr t

答案 1 :(得分:0)

我认为根本原因在于您将index用于两个不同的目的:作为您正在寻找的单词的索引,以及作为节点的索引&#39}。孩子们。
当你进行递归时,index改变了意义,并且从那里开始走下坡路。

您还将index++传递给递归,但index++的值是增量前的值。
你应该通过index + 1

[不同程序中的问题是未指定函数参数的评估顺序,并且您不应该同时修改变量并在同一参数列表中使用它。 (我甚至会说你不应该在参数列表中修改任何,但很多人不同意。)
但是你根本不应该使用相同的变量,所以......]

我会亲自重构代码,如下所示:

Node* search(const string& word, Node* node, int index) const {
    // Return immediately on failure.
    if (index >= word.length())
    {
        return nullptr;
    }

    int child_index = node->getIndex(word[index]);

    // The two interesting cases: we either have this child or we don't.
    if (node->children_[child_index] == nullptr) {
        return nullptr;
    }
    else {
        return search(word, node->children_[child_index], index + 1);
    }
}

(旁注:从Node函数返回指向非const内部const的指针是值得怀疑的。)