2016-02-03 3 views
-4

Я получаю ошибку сегментации в if (currNode->right) проверке. Может ли кто-нибудь заметить очевидную ошибку, которую я совершил?Сегментация Неисправность нулевой проверки указателя

struct node 
{ 
    int data; 
    node* left; 
    node* right; 
}; 

void Preorder(node *root) { 

    std::stack<node*> currStack; 

    currStack.push(root); 

    while(currStack.top()) { 
     node *currNode = currStack.top(); 
     currStack.pop(); 

     if (currNode->right) { 
      currStack.push(currNode->right); 
     } 
     if (currNode->left) { 
      currStack.push(currNode->left); 
     } 

     // Print to console 
     printf("%d ", currNode->data); 
    } 
} 

Это может быть связано с моей основной функцией, поэтому я добавлю его ниже для справки:

int main() { 

    node myNode; 
    myNode.data = 3; 

    node myNode1; 
    myNode1.data = 4; 
    node myNode2; 
    myNode2.data = 5; 
    node myNode3; 
    myNode3.data = 6; 
    node myNode4; 
    myNode4.data = 7; 

    myNode.left = &myNode1; 
    myNode.right = &myNode2; 
    myNode1.left = &myNode3; 
    myNode1.right = &myNode4; 

    Preorder(&myNode); 

    return 0; 
} 
+1

Пожалуйста ** [править] ** Ваш вопрос с [mcve] или [SSCCE (Short, самодостаточной Правильный пример)] (HTTP: // sscce.org) – NathanOliver

+0

Что произошло, когда вы запускали вашу программу через отладчик? Вы все еще не могли найти, где была ошибка? –

+0

Ошибка сегментации не обязательно означает разыменование указателя NULL. Используйте отладчик и посмотрите, что такое значение 'currNode'. – YSC

ответ

0

Найденный Задача: Изменить условие цикла для while(!currStack.empty()) {}

0

currNode кажется недействительным, например, НОЛЬ. Вы должны проверить этот случай перед использованием указателя в условии.

Это может произойти на вашем верхнем узле стека?

+2

Я предполагаю 'while (currStack.top())' должен позаботиться об этом ?? –

+0

Вы получаете следующий указатель из вашего стека '' node * currNode = currStack.top(); '' и считаете, что указатель действителен ... Отладчик был бы хорошим решением, предложенным YSC. –

1

Это связано с неинициализированными значений left и right указателей в myNode2, myNode3 и myNode4.

Определить конструктор для node и вы хорошо:

struct node 
{ 
    int data; 
    node* left; 
    node* right; 
    node() : data(0), left(nullptr), right(nullptr) {} 
}; 
+0

, кажется, сбой при проверке цикла while. Извините, что я не могу понять другую ошибку, которая все еще существует в коде. –

+0

Si Te Feng, вам понадобится это, а также измените время проверки на while (! CurrStack.empty()) – Egari

-1

На самом деле, я считаю while(currStack.top()) довольно странное состояние. top() возвращает ссылку на const, а не указатель (если вы когда-либо ожидали получить NULL). Но если ссылочное значение является указателем, и оно равно NULL, или если мы получим ссылку на, скажем, int = 0, цикл завершается. Вы уверены, что это то, что вы хотели? И если в стеке нет элементов, это, вероятно, приводит к неопределенному поведению, но он определенно не может вернуть NULL, если вы этого ожидали.

+0

Ссылка на 'node *', которая может быть NULL;) – YSC

+0

@YSC Правильно, и пожалуйста прочитайте его еще раз, я на самом деле упомянул об этом и сказал, что цикл закончится в этом случае. Я просто не думал, что он хочет закончить его, когда получит какой-либо указатель NULL. – Aikei

+0

@YSC И поскольку он говорит выше, что его код падает на цикл while, он действительно хотел проверить, пуст ли пуст с while (currStack.top()), ожидая получить NULL в этом случае. Который он не может. – Aikei

Смежные вопросы