2016-10-28 2 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!"); 
} 

이 이제 I 16 개 요소

cache->set = malloc(16 * sizeof(cache->set)); 
//same error check as above here, just left our for precision of question 
,536 구조체와 집합의 배열의 메모리를 할당 잘 작동

이 또한 지금은 다시이 작품 설정

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 개의 요소가있는 집합 struct의 배열이 들어 있으며, 각 set 요소에는 2 개의 요소가있는 block struct 배열이 있어야합니다.

여러분 중 누구라도 나를 도울 수 있기를 바랍니다.

답변

2

코드에서 가장 먼저 메모리 할당이 잘못되었습니다. 모든 메모리 할당에 대해 잘못된 크기를 제공하고 있습니다. 예를 들어,

cache = malloc(sizeof(cache)); 

cache = malloc(sizeof(*cache)); 

과 유사해야한다.

그런 다음 cache->set->blocks[i]은 이 아니고 block_t *이 아니므로 메모리를 동적으로 할당 할 필요가 없습니다.

+0

안녕하세요! 답장 해주셔서 매우 감사합니다! 나는 약간 혼란 스럽다. 캐시 대신 * 캐시 크기를 제공해야하는 이유를 설명해 주시겠습니까? 또한 cache-> set-> blocks는 struct block_t의 2 요소의 배열이어야합니다. 그 사람들이 기억을 할당 받아야하지 않습니까? – nichos