Я очень озадачен следующим кодом:
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, но они оба инициализированы.
Нет неуказанное содержание. Это содержимое может быть случайным мусором в памяти или может оказаться равным 0, в зависимости от того, какие данные были оставлены в их ячейке памяти заранее.
Может случиться так, что из-за того, как код был скомпилирован, конкретное расположение стека, содержащее root
всегда имеет 0 (скажем, потому что более ранняя локальная переменная, занимающая то же место в стеке, всегда заканчивалась 0). Но вы не можете полагаться на это поведение — вы должны правильно инициализировать что-либо, прежде чем читать его обратно, иначе вы попадете в страну неопределенного поведения.
Фактическое значение по умолчанию, к которому неявно инициализируется указатель, будет зависеть от используемого вами компилятора.
Компилятор Visual C (v2012) автоматически инициализирует его как __nullptr, что равно NULL. Посмотри в MSDN документ (см. последний пример).
Я хотел бы проверить ваше руководство по компилятору, если вы хотите больше информации.
Вы не инициализируете root
где угодно, подходящим местом для его инициализации будет конструктор.