Программирование на C: Ошибка сегментации в структуре ptr.Проблема с выделением памяти - PullRequest
0 голосов
/ 28 декабря 2018

Я получаю segfault во время выполнения по адресу:

Я пытаюсь построить эту модель кэш-памяти в C.

Итак, код компилируется нормально, но я получаю segfault во время выполнения.Я проследил это до этой строки:

cache->set[i]->block = (Block *) malloc( cache->numSets * sizeof( Block ) );

Я пытался создать Block как массив внутри Set struct.Но это порождает другие проблемы, а infact - ту же ошибку сегментации.

typedef struct CacheMemory* Cache;
typedef struct Set_* Set;
typedef struct Block_* Block;

struct Block_ {
    int valid;
    int tag; // int *tag;
    int dirty;
};

struct Set_ {
    int numBlocks;
    Block *block;
};

struct CacheMemory {
  <snip>
  Set *set;
};

Cache cache;
cache = (Cache) malloc(sizeof ( struct CacheMemory ) );

cache->set = (Set *) malloc( numSets * sizeof( Set ) );

    for (i=0; i<cache->numSets; i++) {
           //for (j = 0; j < cache->blockSize; j=j+1) {
                // Note: I get segfault at line below during runtime
                cache->set[i]->block = (Block *) malloc( cache->numSets *sizeof( Block ) );
                    //cache->set[i]->block[j] = (Block_) malloc (sizeof(Block_) );
       // }
    }

1 Ответ

0 голосов
/ 28 декабря 2018

Set - это указатель на struct Set_, поэтому ваш malloc

cache->set = (Set *) malloc( numSets * sizeof( Set ) );

резервирует указатели, а не struct Set_ -объекты.Переписать его как

cache->set = (Set *) malloc( numSets * sizeof( struct Set_ ) );

должно помочь, по крайней мере, решить эту проблему.

...