我对以下代码非常困惑:
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
变量是main函数的本地变量,因此我预计它不会将其成员初始化为0,但它们都已初始化。
答案 0 :(得分:12)
不,它有未指定的内容。这些内容可能是随机内存垃圾,或者它们可能恰好为0,具体取决于事先留在内存位置的数据。
由于编译代码的方式,可能会发生这种情况,包含root
的特定堆栈位置始终为0(例如,因为占用相同堆栈位置的早期局部变量总是最终为0)。但你不能依赖这种行为 - 你必须在读回之前正确地初始化任何东西,否则你就进入了未定义行为之地。
答案 1 :(得分:2)
指针隐式初始化的实际默认值取决于您使用的编译器。 Visual C编译器(v2012)将自动初始化为__nullptr,它等于NULL。看看at the MSDN doc(参见最后一个例子)。
如果您想了解更多信息,我会尝试检查您的编译器手册。
答案 2 :(得分:0)
你没有在任何地方初始化root
,初始化它的适当位置是构造函数。