私のプログラムでセグメンテーションフォルトが発生しましたが、私はそれが愚かな間違いだと確信しています!構造体の配列内のデータにアクセスしようとすると、私は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」のためのメモリを割り当てていない
構文エラー);' – melpomene
あなたが唯一 'cache-にメモリを割り当てる>設定[0 ] .blocks'。cache-> set [1] .blocks'はガベージ・ポインタです。 – melpomene
何かの理由で、cache_tのtypedefが自分のコードからコピー・ペーストされていません。 私はsizeof(キャッシュ)の代わりに(*キャッシュ)を割り当てますか?前の質問で私はsizeof(キャッシュ)が間違っていて、sizeof(*キャッシュ)であるべきだと言った同じコードを尋ねました。 – nichos