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

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

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). Но вы не можете полагаться на это поведение — вы должны правильно инициализировать что-либо, прежде чем читать его обратно, иначе вы попадете в страну неопределенного поведения.

12

Другие решения

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

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

2

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

0
По вопросам рекламы [email protected]