c ++ Невозможно инициализировать массив указателей на ноль c ++ - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать 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;
        }
    }

1 Ответ

0 голосов
/ 08 октября 2018
trie::trie()
{
    root = NULL;
    for(int i = 0; i < 26; i++){
    root->children[i] = NULL;  // you are following the nullptr
    }
}

В современном C ++ вы должны использовать nullptr вместо NULL.Нет, на самом деле вы должны использовать умные указатели, такие как std::shared_ptr<> и std::unique_ptr<> или std::vector<>.

. Я предлагаю вам прочитать № 2 из Десять заповедей для программистов на C :

2: Ты не должен следовать указателю NULL, потому что хаос и безумие ждут тебя в конце.

Очевидно, что священные писания были неправильно истолкованы здесь, как должны были быть слова`` нулевой указатель '', чтобы свести к минимуму путаницу между концепцией нулевых указателей и макросом NULL (которых больше нет).В противном случае смысл прост.Нулевой указатель указывает на области, заполненные драконами, демонами, дампами ядра и бесчисленным количеством других грязных существ, и все они радуются резвости в вашей программе, если вы нарушаете их сон.Нулевой указатель не указывает на 0 любого типа, несмотря на некоторый богохульный старый код, который безоговорочно предполагает это.

«Следовать за нулевым указателем» здесь означает разыменовать его.

...