Почему корневой указатель всегда инициализируется нулем?

Я очень озадачен следующим кодом:

class Tree {
protected:
    struct Node {
        Node* leftSibling;
        Node* rightSibling;
        int value;
    };  
private:
    Node* root;
    int value;
.....
public:
    void addElement(int number) {
        if (root == NULL) {
            printf("This is the value of the pointer %lld\n",(long long)root);
            printf("This is the value of the int %d\n",value);
            ...
            return;
        }
        printf("NOT NULL\n");
    }
};


int main() {
    Tree curTree;
    srand(time(0));
    for(int i = 0;i < 40; ++i) {
        curTree.addElement(rand() % 1000);
    }
}

curTree переменная является локальной для основной функции, поэтому я ожидал, что ее члены не будут инициализированы в 0, но они оба инициализированы.

3 ответа

Решение

Нет, он имеет неопределенное содержание. Это содержимое может быть случайным мусором в памяти или может оказаться равным 0, в зависимости от того, какие данные были оставлены в их ячейке памяти заранее.

Может случиться так, что из-за того, как код был скомпилирован, конкретное расположение стека, содержащее root всегда имеет 0 (скажем, потому что более ранняя локальная переменная, занимающая то же место в стеке, всегда заканчивалась 0). Но вы не можете полагаться на это поведение - вы должны правильно инициализировать что-либо, прежде чем читать его обратно, иначе вы попадете в страну неопределенного поведения.

Фактическое значение по умолчанию, к которому неявно инициализируется указатель, будет зависеть от используемого вами компилятора. Компилятор Visual C (v2012) автоматически инициализирует его как __nullptr, что равно NULL. Взгляните на документ MSDN (см. Последний пример).

Я хотел бы проверить ваше руководство по компилятору, если вы хотите больше информации.

Вы не инициализируете root где угодно, подходящим местом для его инициализации будет конструктор.

Другие вопросы по тегам