2013-10-11 122 views
2

我在initializeStruct函數中遇到了分段錯誤。 我想要一個2D數組指針。每個2D數組索引都包含三種類型的結構。對二維數組指針使用malloc會導致分段錯誤

這裏的結構:

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創建我的二維數組指針:

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); 
+0

可能的重複[如何正確設置,訪問和釋放C中的多維數組?](http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up- access-and-free-a-multidimensional-array-in-c) – Lundin

回答

2

你做的方式只是malloc'編輯你的數組的第一維。 您需要malloc每個行:

struct cacheLine **cacheArray = malloc(sizeof(struct cacheLine*)*S); 
for(i = 0;i < S;i++) { 
    cacheLine[i] = malloc(sizeof(struct cacheLine) * E); 
} 
+1

感謝您的幫助,我將cacheLine [i]更改爲cacheArray [i]。再次這是偉大 –

1

你的malloc是錯誤的 - 你想在第一的malloc分配S然後爲每個malloc的E項目;相反,你是malloc'ing S*E,永遠不要指向他們

+0

謝謝,這現在更有意義。 –

+0

'malloc'沒有錯,他訪問它的方式是錯誤的。 – cenouro

2

你正在聲明一個二維數組,即指針數組。爲此您分配一個內存區域。

你期待什麼:

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的,並計算你的指數(I * E + J)或者你可以堅持2d陣列,而是單獨初始化線。我會建議使用1d數組。