2

initializeStruct 関数でセグメンテーション違反が発生しています。2D Array ポインターが必要です。各 2D 配列インデックスは、3 つのタイプの構造体を保持します。

構造体は次のとおりです。

struct cacheLine {
    int validBit;
    int tag;
    int LRUcounter;
};

これは失敗するメソッドです:

void initializeStruct(struct cacheLine **anyCache){
    int i, j;
    for (i=0;i<S;i++){
        for(j=0;j<E;j++){
            anyCache[i][j].validBit = 0; //I am getting a Segmentation fault
            anyCache[i][j].tag = 0;
            anyCache[i][j].LRUcounter = 0;
        }
    }
    return;
}

主に、malloc を使用して 2D 配列ポインターを作成します。

int main(int argc, char** argv){
int opt;
char *t;

//looping over arguments from command line
while(-1 != (opt = getopt(argc, argv, "s:E:b:t:"))){
    //determine which argument it's processing
    switch(opt){
        case 's':
            s = atoi(optarg);
            break;
        case 'E':
            E = atoi(optarg);
            break;
        case 'b':
            b = atoi(optarg);
            break;
        case 't':
            t = optarg;
            break;
        //too many arguments
        default:
            printf("wrong argument\n");
            break;
    }
}
//create array
S = 1 << s;
B = 1 << b;

//allocate memory
struct cacheLine **cacheArray =  malloc(sizeof(struct cacheLine)*S*E);

//Initialize Structs
initializeStruct(cacheArray);
4

3 に答える 3

2

2D 配列、つまりポインターの配列を宣言しています。それにメモリ領域を割り当てます。

あなたが期待するもの:

array_0_0, array_0_1, ..., array_0_s
array_1_0, array_1_1, ..., array_1_s
...

あなたが実際に宣言したこと:

array_0 -> NULL
array_1 -> NULL
...
array_n -> NULL
lots of wasted space

malloc で 1D 配列を使用してインデックス (i * E + j) を計算するか、2D 配列に固執して代わりに行を個別に初期化することができます。1d 配列を使用することをお勧めします。

于 2013-10-11T14:35:45.660 に答える