2016-10-28 128 views
0

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

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

回答

2

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

cache = malloc(sizeof(cache)); 

应该是

cache = malloc(sizeof(*cache)); 

并且同样。

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

+0

嗨!非常感谢您的回复! 虽然我有点困惑。 您能否解释为什么我应该使用*缓存而不是缓存来提供大小? 此外,cache-> set-> blocks应该是struct block_t的2个元素的数组。不应该分配内存吗? – nichos