C++ c++;无法初始化指向空c++;

C++ c++;无法初始化指向空c++;,c++,pointers,null,C++,Pointers,Null,我试图创建一个trie,但是当我将数组中的指针初始化为NULL时,它会中断程序。程序完成,但不会输出任何内容。为什么要这样做我看了网上的例子,他们正在这样做 class trie { private: struct Node { char letter; Node *children[26]; }; //the beginning of the trie

我试图创建一个trie,但是当我将数组中的指针初始化为
NULL
时,它会中断程序。程序完成,但不会输出任何内容。为什么要这样做我看了网上的例子,他们正在这样做

class trie
    {
    private:
        struct Node
        {
            char letter;
            Node *children[26];

        };

        //the beginning of the trie
        Node *root;

    public:
        /* Constructors with No Arguments */
        trie(void);

        /* Destructor */
        ~trie(void);

        //Function to insert string into the trie.
        void insert(string word);
        //Function to help insert
        void insertHelper(string word, Node * & trieNode);
        //Funtion to print the contents of the trie.
        void printTrie();
        //Function to get the index if a char matches.
        int getIndex(char letter);
    };
    trie::trie()
    {
        /* Initialize the root of the node */
        root = NULL;
        for(int i = 0; i < 26; i++){
        root->children[i] = NULL;
        }
    }
class-trie
{
私人:
结构体类型
{
字符字母;
节点*子节点[26];
};
//trie的开始
节点*根;
公众:
/*没有参数的构造函数*/
trie(无效);
/*析构函数*/
~trie(无效);
//函数将字符串插入到trie中。
空白插入(字符串字);
//用于帮助插入的函数
void insertHelper(字符串字、节点*&三节点);
//打印trie内容的函数。
void printTrie();
//函数以在字符匹配时获取索引。
int getIndex(字符字母);
};
trie::trie()
{
/*初始化节点的根*/
root=NULL;
对于(int i=0;i<26;i++){
root->children[i]=NULL;
}
}
trie::trie()
{
root=NULL;
对于(int i=0;i<26;i++){
root->children[i]=NULL;//您正在跟踪nullptr
}
}
<>在现代C++中,你应该使用<代码> NulLPTR < /C>而不是<代码> null <代码>。不,事实上,您应该使用智能指针,如
std::shared\u ptr
std::unique\u ptr
std::vector

我建议您阅读#2:

2:你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。 很明显,圣经在这里被误译了,因为单词应该是“空指针”,以尽量减少空指针概念和宏空指针(其中更多是空指针)之间的混淆。否则,意思很简单。空指针指向充满龙、恶魔、核心垃圾和无数其他肮脏生物的区域,如果你打扰它们的睡眠,所有这些生物都喜欢在你的程序中嬉戏。空指针不指向任何类型的0,尽管有一些亵渎神明的旧代码恶意地假设了这一点

这里的“跟随空指针”意味着取消对它的引用。

trie::trie()
{
root=NULL;
对于(int i=0;i<26;i++){
root->children[i]=NULL;//您正在跟踪nullptr
}
}
<>在现代C++中,你应该使用<代码> NulLPTR < /C>而不是<代码> null <代码>。不,事实上,您应该使用智能指针,如
std::shared\u ptr
std::unique\u ptr
std::vector

我建议您阅读#2:

2:你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。 很明显,圣经在这里被误译了,因为单词应该是“空指针”,以尽量减少空指针概念和宏空指针(其中更多是空指针)之间的混淆。否则,意思很简单。空指针指向充满龙、恶魔、核心垃圾和无数其他肮脏生物的区域,如果你打扰它们的睡眠,所有这些生物都喜欢在你的程序中嬉戏。空指针不指向任何类型的0,尽管有一些亵渎神明的旧代码恶意地假设了这一点


这里的“跟随空指针”意味着取消对它的引用。

运行的代码在哪里?欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:您似乎知道自己在做什么,取消对空指针的引用。你的老师、书或教程没有告诉你不能取消对空指针的引用吗?尝试这样做会导致或可能导致崩溃。在
trie::trie()
root=NULL和两行之后的
root->children
。这是访问空指针<代码>根->子项[i]=NULL--问题是--没有根。请仔细阅读您的代码,因为问题只比我的评论高出两行。-为什么要这样做?我看了一些网上的例子,也许可以解释这个问题。您看到的是“在线示例”和盲目复制,而不是实际了解代码在做什么。运行的代码在哪里?欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:您似乎知道自己在做什么,取消对空指针的引用。你的老师、书或教程没有告诉你不能取消对空指针的引用吗?尝试这样做会导致或可能导致崩溃。在
trie::trie()
root=NULL和两行之后的
root->children
。这是访问空指针<代码>根->子项[i]=NULL--问题是--没有根。请仔细阅读您的代码,因为问题只比我的评论高出两行。-为什么要这样做?我看了一些网上的例子,也许可以解释这个问题。你看到的是“在线示例”和盲目复制,而不是真正了解代码在做什么。我认为这不是他的问题。请看@Scheff对这个问题的评论。@sagi这是一个恭敬的问题。这是UB,它没有将正确节点的子节点设置为null。我确实认为这是他的问题。看看@Scheff对这个问题的评论。我记得在SGI Irix上,访问
NULL
指针并没有像我以前在x86上使用的那样立即崩溃。它到底做了什么我一直都不知道。(尽管如此,S/W总是有一些我从未发现的神秘虫子。)
trie::trie()
{
    root = NULL;
    for(int i = 0; i < 26; i++){
    root->children[i] = NULL;  // you are following the nullptr
    }
}