【问题标题】:Why does the root pointer get initialized to null always?为什么根指针总是被初始化为空?
【发布时间】:2013-09-07 04:35:54
【问题描述】:

我对下面的代码很困惑:

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

【问题讨论】:

  • 类是否有用户定义的默认构造函数?
  • 您本质上是在问为什么会这样吗? if (root == NULL) 以及为什么 root 最终会为空?
  • 您正在打印的valueaddElement 的参数,而不是私有成员。使用this-&gt;value 打印属性。
  • 没有用户定义的构造函数。我在问为什么要初始化这些值,因为我认为它们不应该如此。感谢 agbinfo 指出我遇到的那个非常愚蠢的错误。
  • @user502248:零是未初始化的有效值。

标签: c++ variable-initialization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,这取决于编译器。虽然我会说编写可移植代码.. 你应该定义构造函数并初始化数据。
    【解决方案3】:

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

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

    【讨论】:

    • 读者文摘版:你很幸运 :)
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多