Почему этот цикл не обнаруживает нулевой указатель?

0

Итак, это мой код:

while(node) {
    cout<<node->getDiameter();
    node=node->stepAbove();
}

это методы:

Node* Node::stepAbove() {
    return this->above;
}
int Node::getDiameter() {
    return this->r;
}

но цикл while вызывает нарушение доступа, потому что цикл не обнаруживает нулевой указатель. При отладке он указывает на адрес "0xcccccccc", который не имеет ничего определенного... Любое предложение, где проблема?

EDIT: Забыл, чтобы опубликовать мой конструктор:

Node(int x=0) {
    this->above=nullptr;
    this->r=x;
}
  • 1
    Похоже, у вас нет нулевого указателя ...
  • 2
    Это не null, это неинициализировано. Скорее всего на этой - this->above линии.
Показать ещё 12 комментариев
Теги:
nullpointerexception
null

2 ответа

3
Лучший ответ

Существует различие между uninitialized указателем и null указателем в C++

struct node
{

};

int main()
{
    node *n1 = 0;
    node *n2;

    if(!n1)
        std::cout << "n1 points to the NULL";

    if(!n2)
        std::cout << "n2 points to the NULL";
}

Попробуйте запустить этот код, и вы увидите, что n2 указывает на NULL. Вы удивляетесь, почему? Это связано с тем, что n1 явно указывается на нуль, но я не делал то же самое с n2. В стандарте C++ не указывается, какой адрес должен содержать неинициализированный указатель. И там, 0xcccccccc, кажется, является адресом, который ваш компилятор выбрал по умолчанию для режима отладки.

  • 0
    К счастью, большинство компиляторов выдаст предупреждение, если вы сделаете это. Так что еще одна причина не игнорировать предупреждение компилятора ;-)
1

В ваших конструкторах задайте поля NULL, которые не инициализируются параметрами конструктора, например:

Node::Node(float radius) 
{
    above = NULL;
    r = radius;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню