2016-10-28 6 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構造体の配列が保持されます。これらの各セット要素には、2つの要素を持つブロック構造体の配列が必要です。

あなたのいずれかが私を助けてくれることを願っています!

答えて

2

まず、コードでは、メモリ割り当てが間違っています。すべてのメモリ割り当てに間違ったサイズを提供しています。例えば、

cache = malloc(sizeof(cache)); 

cache = malloc(sizeof(*cache)); 

と同様であるべきです。

その後、cache->set->blocks[i]は、タイプblock_tであり、block_t *ではないため、メモリを動的に割り当てる必要はありません。

+0

こんにちは!ご返事ありがとうございます! 私はちょっと混乱しています。 キャッシュの代わりに*キャッシュを指定する理由を説明できますか? また、cache-> set->ブロックは、struct block_tの2つの要素の配列でなければなりません。メモリを割り当てるべきではありませんか? – nichos

関連する問題