我在初始化结构函数中遇到分段错误。我想要一个 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 argumentn");
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 数组并单独初始化行。我建议使用 1d 数组。
你的 malloc 是错误的 - 你想在第一个 malloc 中分配S
,然后为每个 malloc E
项分配;相反,你S*E
malloc's 并且从不将它们指向任何东西