我正在尝试用 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
这也行,现在我为集合中的 block 数组分配内存
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 个元素的集合结构数组,这些集合元素中的每一个都应该包含一个包含 2 个元素的 block 结构数组。
希望大家能帮帮我!
最佳答案
首先,在您的代码中,您的内存分配是错误的。您为每个内存分配提供了错误的大小。例如,
cache = malloc(sizeof(cache));
应该是
cache = malloc(sizeof(*cache));
同样。
之后cache->set->blocks[i]
的类型是block_t
,而不是block_t *
,所以这不根本不需要动态分配内存。
关于c - 内存分配 结构数组结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314139/