我试图用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个元素的结构集数组的内存
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结构数组。
希望你们任何人都可以帮助我!
答案 0 :(得分:2)
首先,在您的代码中,您的内存分配是错误的。您为每个内存分配提供了完全错误的大小。例如,
cache = malloc(sizeof(cache));
应该是
cache = malloc(sizeof(*cache));
同样如此。
之后,cache->set->blocks[i]
的类型为block_t
,而不是block_t *
,因此根本不需要动态分配内存。