2016-10-30 6 views
-1

私のプログラムでセグメンテーションフォルトが発生しましたが、私はそれが愚かな間違いだと確信しています!構造体の配列内のデータにアクセスしようとすると、私はsegemtentationフォールトを取得します。アレイセグメンテーションフォルトのデータにアクセスする

struct block { 
    int validBit;       
    int tag;        
    unsigned long data;    
}; 
typedef struct block block_t; 

struct set{ 
block_t *blocks; 
int tst; 
}; 
typedef struct set set_t; 

struct cache{ 
    //bunch of variables I have left out for this question 

    set_t *set; 
}; 
typedef struct cache cache_t; 

したがって、これらのメモリの割り当ては、キャッシュ16個の要素を持つセットの配列を保持

cache_t *cache = NULL; 
cache = malloc(sizeof(*cache); 
if(cache == NULL){ 
    fprintf(stdout,"Could not allocate memory for cache!"); 
} 

cache->set = malloc(16 * sizeof(*cache->set)); 
if(cache->set == NULL){ 
    fprintf(stdout,"Could not allocate memory for cache->set!"); 
} 

cache->set->blocks = malloc(2 * sizeof(*cache->set->blocks)); 
if(cache->set->blocks == NULL){ 
fprintf(stdout,"Could not allocate memory for cache->set->blocks!"); 
} 

あります。 cache-> setsは、2つの要素を持つブロックの配列を保持します。

私はセグメンテーションエラーが発生し、構造体ブロック内の変数の値を設定してみてください。

cache->set[0].blocks[0].tag = 1; //This works 
cache->set[0].blocks[1].tag = 2; //This works 
cache->set[1].blocks[0].tag = 3; //Segmentation fault 

EDIT:ブロック内に変数「タグ」に問題があるようです。 set [1]でvalidbitに値を代入すると、セグメンテーション違反は発生しません。

cache->set[1].blocks[0].validBit = 3; // This works 
cache->set[1].blocks[0].tag = 3; //does not work 

タグ変数に問題があるようですか?私にはセットを越えてあなたの「block_t」のためのメモリを割り当てていない

+0

構文エラー);' – melpomene

+1

あなたが唯一 'cache-にメモリを割り当てる>設定[0 ] .blocks'。cache-> set [1] .blocks'はガベージ・ポインタです。 – melpomene

+0

何かの理由で、cache_tのtypedefが自分のコードからコピー・ペーストされていません。 私はsizeof(キャッシュ)の代わりに(*キャッシュ)を割り当てますか?前の質問で私はsizeof(キャッシュ)が間違っていて、sizeof(*キャッシュ)であるべきだと言った同じコードを尋ねました。 – nichos

答えて

1

:)事前に

おかげでも意味がありません[0]。

大雑把に、あなたはこれらの線に沿って何かをする必要があります。 `キャッシュ= malloc関数(はsizeof(*キャッシュで

cache = malloc(sizeof *cache); 
cache->set = malloc(num_sets * sizeof *cache->set); 
for (i = 0; i < num_sets; i++) { 
    cache->set[i].blocks = malloc(...); 
} 
+0

ありがとうございました!それが判明したとき、私はその主題についての知識があまりにも少なかったのです!どうもありがとうございました! – nichos

関連する問題