Проверка того, является ли указатель в структуре нулевым

У меня очень простая структура

 struct Node{
     Node* pNext;
     int nValue;
 };

и я пытаюсь всегда добавлять в pNext значение, отличное от нуля.

Node *head;


void add(int nValue){
    if (!head)
    {  
        Node *node = new Node;
        node->nValue=nValue;
        head = node;
    }
    else
    {
        add(head,nValue);
    }
}

void add(Node *pNode, int nValue){
    if (!(pNode->pNext))
    {
        Node *node = new Node;
        node->nValue=nValue;
        pNode->pNext = node;
    }
    else
    {
        add(pNode->pNext,nValue);
    }
}

Когда я вызываю add(10); в первый раз он устанавливает головной указатель на созданный узел. но когда я снова вызываю метод add(9); я получаю «Место чтения нарушения доступа 0xCDCDCDCD».

Мой вопрос: как я могу проверить, назначен ли узлу pNext адрес или нет? Я пытался использовать == nullptr, но безрезультатно.


person dwardu    schedule 02.09.2013    source источник


Ответы (4)


Вы не инициализировали указатель pNext, поэтому он, вероятно, имеет какое-то случайное значение.

Попробуйте использовать это объявление:

 struct Node{
   //Default constructor, which sets all values to something meaningful
   Node():pNext(nullptr), nValue(0) {}

   Node* pNext;
   int nValue;
 };
person Johny    schedule 02.09.2013

Измените свой код на:

Node *head;


void add(int nValue){
    if (!head)
    {  
        Node *node = new Node;
        node->nValue=nValue;
        **node->pNext =NULL;**
        head = node;
    }
    else
    {
        add(head,nValue);
    }
}

void add(Node *pNode, int nValue){
    if (!(pNode->pNext))
    {
        Node *node = new Node;
        node->nValue=nValue;
        **node->pNext =NULL;**
        pNode->pNext = node;
    }
    else
    {
        add(pNode->pNext,nValue);
    }
}
person sara    schedule 02.09.2013

Вы забываете установить head на NULL для начала и установить pNext на NULL во вновь созданных узлах.

В отличие от, например, Java, C++ не инициализируют автоматически переменные до 0 (или эквивалента).

person molbdnilo    schedule 02.09.2013

вам нужно правильно инициализировать pNext, явно установив его в nullptr в конструкторе node. 0xCDCDCDCD всегда находится в индикаторе обращения к неинициализированной памяти.

person Sebastian Steger    schedule 02.09.2013