【问题标题】:Initialize a pointer to a class with NULL values初始化指向具有 NULL 值的类的指针
【发布时间】:2010-11-23 05:59:52
【问题描述】:

我正在尝试初始化一个指向我创建的 NODE 结构的指针数组

struct Node{
    int data;
    Node* next;
};

the private member of my other class is declared as

Node** buckets;

目前初始化为 buckets = 新节点*[SIZE]

是否有初始化数组,使其成员指向 NULL 或其他一些预定义的节点指针?

编辑:我正在寻找一种方法来初始化它,而无需尝试生成一个 for 循环来遍历数组的整个长度。数组的大小在运行时确定。

编辑 2:我尝试了 std::fill_n(buckets, SIZE_OF_BUCKET, NULL);但是编译器给出了错误“无法从'const int'转换为'Node *'”我正在使用Visual Studio 2008。我做错了什么吗?

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    首先,最简单的解决方案是执行以下操作:

    Node** buckets = new Node*[SIZE]();
    

    正如litb 之前所说,这会将SIZE 指针初始化为空指针。

    但是,如果您想做类似Node **buckets 的操作并将所有指针初始化为特定值,那么我推荐 std::fill_n from <algorithm>

    Node **buckets = new Node*[SIZE];
    std::fill_n(buckets, SIZE, p);
    

    这将在分配后将每个 Node*' 设置为 p

    此外,如果您希望节点在构造时具有健全的成员值,正确的方法是使用构造函数。像这样的:

    struct Node {
        Node() : data(0), next(NULL){}
        Node(int d, Node *n = NULL) : data(d), next(n) {}
    
        int data;
        Node* next;
    };
    

    这样你就可以做到:

    Node *p = new Node();
    

    它会被正确初始化为 0 和 NULL,或者

    Node *p = new Node(10, other_node);
    

    最后,这样做:

    Node *buckets = new Node[N]();
    

    将构造 N Node 对象并默认构造它们。

    【讨论】:

    • 好吧,我删除了我的答案,因为你已经集成了这个东西,而且你的答案更旧。为什么不将该行移到最顶部,以便人们先阅读它?
    • 我试过 std::fill_n(buckets, SIZE_OF_BUCKET, NULL);但编译器给出错误“无法从'const int'转换为'Node *'”我正在使用Visual Studio 2008
    • 如果将NULL 传递给fill_n,则需要对其进行类型转换,因为编译器会将类型推断为int 而不是pointerfill_n(buckets, SIZE, static_cast<Node*>(NULL))。您也可以显式指定模板参数,但这会变得很难看,因为您想要的参数是第三个,因此您还需要包括前两个,即使编译器可以在没有您提示的情况下推断它们:fill_n<Node**, int, Node*>(buckets, SIZE, NULL)。跨度>
    • 这行得通。但我仍然收到警告“警告 C4996:'std::fill_n': 带有可能不安全参数的函数调用”
    • 尝试使用 0 代替 NULLNULL 是 C 主义,C++ 使用 0。(C++0x 使用 null_ptr 什么的)
    【解决方案2】:

    如果你的意思是数组你的指针数组buckets,那么是的。只需设置buckets = NULL

    编辑:根据您的问题编辑,只需使用 memset。

    memset(buckets, 0, NUM_ELEMENTS_IN_BUCKETS*sizeof(Node*));
    

    【讨论】:

    • 从技术上讲,使用 memset 将指针设置为 0 与将其设置为 NULL 是不同的。该标准规定指针上下文中使用的 0 常量是空常量。但是,这是将指针的实际位模式设置为 0,这不一定是 null 常量。
    • 我删除了不正确的一面,而不是 sizeof(any pointer) 总是 4。
    • @Evan 我相信 C++ 中的空指针总是 0...不是吗? @others 是的,哎呀...我仍然生活在 32 位世界中;)
    • @Shaggy,常量 0 是空常量,但这与 0 位模式不同。有几种体系结构对于 NULL 具有非 0 位模式。 (然而,不管这个事实如何,在 C++ 中 null 常量仍然是 0)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2013-04-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多