我试图用C做缓存,但我在结构的最后一个数组分配内存时遇到了问题
struct block{
int validBit;
char *tag;
}
typedef struct block block_t;
Struct set{
block_t *blocks;
}
typedef struct set set_t;
Struct cache{
//Some other variables but not important for this question
set_t *set;
}
typedef struct cache cache_t;
我在setupCache()函数中为缓存分配内存
cache_t *cache = NULL;
cache = malloc(sizeof(cache));
if(cache == NULL){
fprintf(stdout, "Could not allocate memory for cache!");
}
这个工作得很好,现在我分配一个包含16个元素的struct数组的内存
cache->set = malloc(16 * sizeof(cache->set));
//same error check as above here, just left our for precision of question
这也可以,现在我为集合
中的块数组分配内存for(i = 0; i < 16; i++){
cache->set->blocks = malloc(2 * sizeof(cache->set->blocks));
还是可以的,但是麻烦来了
cache->set->blocks[i] = malloc(sizeof(block_t));
这给了我一个错误:从类型' void * '分配类型' block_t '时不兼容的类型
不太确定我做错了什么,可能是一些愚蠢的事情。
应该是这样的:缓存中有一个包含16个元素的set结构体数组,每个set元素都应该有一个包含2个元素的block结构体数组。
希望你们中的任何人都能帮助我!
首先,在您的代码中,内存分配是错误的。您为每个内存分配提供了错误的大小。例如
cache = malloc(sizeof(cache));
应该cache = malloc(sizeof(*cache));
,同样。
之后,cache->set->blocks[i]
的类型是block_t
,而不是block_t *
,因此根本不需要动态分配内存。