2016-10-28 2 views
0

Im пытается сделать тайник с 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!"); 
} 

Это прекрасно работает, теперь я выделяю память массива множества STRUCT с 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)); 

Это дает мне ошибку: несовместимые типы при присвоение типа 'block_t' из типа 'void *'

Не совсем уверен, что я делаю неправильно, возможно, что-то глупое.

Это как должно быть: Кэш содержит массив множества struct с 16 элементами, каждый из этих элементов набора должен иметь массив блочной структуры с 2 элементами.

Надеюсь, что кто-то из вас может мне помочь!

ответ

2

Прежде всего, в вашем коде распределение памяти неверно. Для каждого распределения памяти вы производите неправильный размер. Например,

cache = malloc(sizeof(cache)); 

должен быть

cache = malloc(sizeof(*cache)); 

и аналогичным образом.

После этого cache->set->blocks[i] имеет тип block_t, а не block_t *, так что это не обязательно должно выделяться память динамически.

+0

Привет! Большое спасибо за Ваш ответ! Я немного смущен. Не могли бы вы объяснить, почему я должен предоставить размер * кешем вместо кеша? Кроме того, cache-> set-> blocks должен быть массивом из двух элементов struct block_t. Не следует ли выделять память? – nichos

 Смежные вопросы

  • Нет связанных вопросов^_^