0

更新:在底部回答。

嗨,大家好,

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


    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
4

3 回答 3

2

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

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

...

myHashStrKey()
    : table(num_elements, NULL)  // Initialises vector
{
    ...
}
于 2011-02-20T11:59:49.000 回答
0

线

        doubly * table[hashsize];

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

另请注意,该行

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

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

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

于 2011-02-20T12:13:24.880 回答
0

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

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

于 2011-02-20T18:44:59.287 回答