3

我对以下代码感到非常困惑:

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,但它们都已初始化。

4

3 回答 3

12

不,它有未指定的内容。这些内容可能是随机内存垃圾,或者它们可能恰好为 0,这取决于事先留在其内存位置的任何数据。

由于代码的编译方式,可能会发生这种情况,包含的特定堆栈位置root始终为 0(例如,因为占用同一堆栈位置的早期局部变量始终以 0 结尾)。但是你不能依赖这种行为——你必须在读回之前正确地初始化任何东西,否则你会进入未定义行为的领域。

于 2013-09-03T20:26:44.907 回答
2

指针被隐式初始化的实际默认值将取决于您使用的编译器。Visual C 编译器 (v2012) 会自动将其初始化为 __nullptr,它等于 NULL。查看MSDN 文档(参见最后一个示例)。

如果您想了解更多信息,我会尝试查看您的编译器手册。

于 2013-09-03T20:50:22.517 回答
0

您不会root在任何地方初始化,初始化它的适当位置将是构造函数。

于 2013-09-03T21:08:13.967 回答