我在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);
答案 0 :(得分: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 :(得分: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的一维数组,并计算你的指数(i * E + j),或者你可以坚持使用二维数组,而是单独初始化这些行。我建议使用1d数组。
答案 2 :(得分:1)
你的malloc错了 - 你想在第一个malloc中分配S
然后为每个malloc E
项目分配S*E
;相反,你是malloc'ing {{1}},从不指向任何东西