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();

ここでは、テーブルを Doubly ノードへのポインターの配列にし、すべてのポインターを 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 はバイトを設定するため正しくありませんが、yourはポインタtableの配列であり、各ポインタは1バイト以上(通常は32ビットマシンでは4バイト)です。hashsize sizeof(table) >= hashsize * sizeof(doubly*)

ただし、セグメンテーション違反は、@ Nawazが指摘したように、メモリの巨大なチャンク(少なくとも4G)を書き込もうとした結果である可能性があります。

于 2011-02-20T12:13:24.880 に答える
0

コメントしたように、実際には std::vector を使用する必要があります。

おそらく、STL が提供するものをもっと注意深く調べるべきです。そうしないと、多くの C++ の優れた機能が見逃され、クラスを使用して C を実行することになります。C++ メモリ管理の可能性について詳しく知るために、RAII にも慣れるようにしてください (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。memset のようなものは、最近の C++ ではあまり使用されていません。

于 2011-02-20T18:44:59.287 に答える