[英]Using malloc for 2D array pointer causes segmentation fault
我在initializeStruct函數中遇到分段錯誤。 我想要一個2D數組指針。 每個2D數組索引都包含三種類型的結構。
這是結構:
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);
您剛malloc
的方式是數組的第一維。 你需要malloc
每個行:
struct cacheLine **cacheArray = malloc(sizeof(struct cacheLine*)*S);
for(i = 0;i < S;i++) {
cacheLine[i] = malloc(sizeof(struct cacheLine) * E);
}
您正在聲明一個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
您可以將1D數組與malloc一起使用,並計算索引(i * E + j),也可以堅持使用2d數組,然后分別初始化行。 我建議使用一維數組。
您的malloc錯誤-您想在第一個malloc中分配S
,然后再為每個malloc E
項目分配S
; 相反,您正在分配S*E
並且永遠不要將它們指向任何東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.