0

これは単純な問題だと確信していますが、構造体の動的配列を実装するデータ構造を作成しようとしています。

各構造体はリンクリストを実装します。

したがって、各リストの先頭を指すポインターの配列が必要だと思います。何らかの理由で、メソッド変数を割り当てると、セグメンテーション違反が発生します。できれば、私が間違っていることについて少し説明したいと思います。ありがとう!

また、これらはすべてCacheというクラス内にあるため、定義されていないように見える変数がいくつかありますが、定義されていることを保証します。プログラムのセグメンテーション違反はindexes[i]->next=NULLです。そしてその下の同様の行。

        typedef struct setNode {
    char valid, dirty;
    unsigned int tag;
    setNode *next;
    Cache *nextCache;

} set;
    set **indexes;

    arrayLength = cache_size / block_size;

    indexes = new setNode *[arrayLength];

    set *temp;

    //Step through the array. The array is full of pointers to "Dummy Nodes"
    for (size_t i = 0; i < arrayLength; i++) {
        indexes[i]->next = NULL;
        indexes[i]->valid = 0;
        indexes[i]->dirty = 0;
        indexes[i]->tag = 0;
        //create empty linked list for each tag spot (One for direct mapped. etc...)

         for(size_t i = 0; i < associativity; i++)
         {
         temp = indexes[i];
         temp->next = new setNode;
         temp = temp->next;
         temp->next = NULL;
         temp->valid = 0;
         temp->dirty = 0;
         temp->tag = 0;
         }

    }

}
4

1 に答える 1

1

indexessetはオブジェクトへのポインタの配列ですが、初期化されていません。それらは実際のsetオブジェクトを指しているのではなく、単にランダムなメモリ位置を指しているだけです。ランダムメモリに書き込もうとすることは、セグメンテーション違反の本質です。

setポインタを使用する前に、オブジェクトを割り当てて、ポインタがそれらを指すようにする必要があります。

for (size_t i = 0; i < arrayLength; i++) {
    indexes[i] = new set;
    indexes[i]->next = NULL;
    indexes[i]->valid = 0;
    ...
于 2012-04-26T02:58:33.437 に答える