内存分配结构数组的结构,结构数组

时间:2016-10-28 22:40:17

标签: c pointers malloc dynamic-memory-allocation

我试图用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结构数组。

希望你们任何人都可以帮助我!

1 个答案:

答案 0 :(得分:2)

首先,在您的代码中,您的内存分配是错误的。您为每个内存分配提供了完全错误的大小。例如,

cache = malloc(sizeof(cache));

应该是

cache = malloc(sizeof(*cache));

同样如此。

之后,cache->set->blocks[i]的类型为block_t,而不是block_t *,因此根本不需要动态分配内存。