【问题标题】:How to initialize an array of pointers to a struct in C++?如何在 C++ 中初始化指向结构的指针数组?
【发布时间】:2011-02-20 11:53:57
【问题描述】:

更新: 在底部回答。

大家好,

如何初始化“指向结构的指针数组”?问题是,数组是一个成员变量,而在构造函数中传递给数组声明的大小是变量实体。


    typedef struct Node {
        string key;
        int value;
        struct Node * left;
        struct Node * right;
    }doubly;

    class myHashStrKey{

    private:
        size_t hashsize;
        doubly * table[];

    public:
        myHashStrKey(){
            hashsize = ((size_t)-1);
            doubly * table[hashsize];
            memset(table,NULL,hashsize);// This is giving segmentation fault
        }

    };

//Called constructor;    myHashStrKey sss = myHashStrKey();

在这里,我希望表是指向双节点的指针数组,并且我希望所有指针都初始化为 NULL 。这段代码有什么问题?还有什么其他更好的方法来执行上述操作?提前致谢。

更新:

经过讨论,考虑到尺寸太大,我修改了代码。但是如何用一定数量的 NULL 值填充向量表?我尝试了下面的代码,但它不起作用。

<pre><code>
for(int i =0;i < hashsize;i++){
            table.push_back((doubly *)NULL);
        }

table.insert(table.begin(),hashsize,NULL);
//Both give invalid static_cast from type `int' to type `doubly*'
</code></pre>

回答更新:


    myHashStrKey::table(myHashStrKey::hashsize, static_cast(0));
    myHashStrKey::table(myHashStrKey::hashsize);
    //Above 2 does not work

    for(int i =0;i != myHashStrKey::hashsize;i++){ //lesser than symbol spoils the display
        myHashStrKey::table.push_back((doubly *)NULL);
    }
    //Above works 
    myHashStrKey::table.insert(myHashStrKey::table.begin(),hashsize,((doubly *)NULL));
    //This too works

【问题讨论】:

  • 这是您的实际代码吗? hashsize = ((size_t)-1); 你是怎么编译的?
  • @Oli:那是铸造。这将编译!
  • 它会编译并给出正确的值。
  • 如果 0xFFFFFFFF 被定义为正确的,它会给出正确的值。我很想知道为什么下一行编译?
  • @bsoundra:正如@Nawaz 在现已删除的帖子中指出的那样,这将创建一个长度为 18446744073709551615 个元素的数组! (至少在 64 位机器上。)

标签: c++ multidimensional-array initialization private-members


【解决方案1】:

C++ 标准不支持可变长度数组。相反,只需使用std::vector

private:
    std::vector<doubly *> table;

...

myHashStrKey()
    : table(num_elements, NULL)  // Initialises vector
{
    ...
}

【讨论】:

  • 我正在尝试在这里实现一个 Hashmap。我最初尝试使用表,但它不支持 [] 分配。这就是我使用数组的原因。什么结构可以支持可变长度数组和 [] 赋值,可用于此目的?
  • @Oli:你的意思是 std::vector 允许 [] 赋值?我认为它只允许 []access 。 vector&lt;int&gt; sss; sss[5] = 45; cout &lt;&lt;sss[5]; 给出分段错误
  • @bsoundra: vector&lt;int&gt; sss; 创建一个空向量(size==0),您需要为下一行分配至少 6 个元素才能工作。试图抢占所有你可以预先获得的内存,这样你就不必处理分配了,这不是正确的方法......
  • “C++ 标准不支持可变长度数组。”但是有些编译器无论如何都会接受它们。 (显然这样的编译器并不严格兼容。)
  • myHashStrKey::hashsize = size/3 +1; myHashStrKey::table(myHashStrKey::hashsize,NULL); 给出“错误:不匹配调用 `(std::vector>) (int&, NULL)' "
【解决方案2】:

线

        doubly * table[hashsize];

创建一个局部变量 table,它会遮盖同名成员。

还要注意这一行

        memset(table,NULL,hashsize);// This is giving segmentation fault

不正确,因为它设置了hashsize 字节,而您的tablehashsize 指针 的数组,每个指针都超过一个字节(在 32 位机器上通常为 4 个),即sizeof(table) &gt;= hashsize * sizeof(doubly*)

然而,正如@Nawaz 指出的那样,段错误可能是尝试写入大量内存(至少 4G)的结果。

【讨论】:

    【解决方案3】:

    正如评论,你真的应该使用 std::vector。

    您可能应该更仔细地查看 STL 提供的内容。否则你会错过很多 C++ 的好特性,并且会用类来做 C。尝试熟悉 RAII 以了解更多关于 C++ 内存管理的可能性 (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。像 memset 这样的东西在现代 C++ 中并没有真正使用。

    【讨论】:

    • 我现在已经搬到 std::vector 。但是对于某些数量的元素初始化为 NULL 不起作用。上述所有方法都在排除错误。现在我开始怀疑是否可以用 NULL 值填充向量!!!
    • 认真的吗?表(num_elements,NULL)不起作用?但无论如何,你为什么要保留一个充满空指针的向量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多