Программа на C: Невозможно получить доступ к указателям на seg_list вне mm_init ();(объявлено как глобальная переменная) - PullRequest
0 голосов
/ 31 октября 2019
//Block Structure
typedef struct block {
 /* Header contains size + allocation flag */
 word_t header;
   struct payload{
      struct block *next;
      struct block *prev;
      char var_payload[0];
   }payload;
}block_t;
ps: Is there an obvious issue with this structure? (I have taken care of overheads and round_up for alignment)
---------------x--------------------------------------------------------------------
//global varaiables
static size_t NUM_SEGS = 2;
static size_t seg_min_size[] = {min_block_size, 1024};
// global array of pointers to doubly-linked segregated free list
static block_t *seg_list;
---------------x-------------------------------------------------
bool mm_init(void) {
size_t i; //counter
// create a array of pointers (of type block_t) to free blocks
block_t *seg_list = (block_t *)(mem_sbrk(NUM_SEGS * sizeof(block_t)));
if (seg_list == (void *)-1) {
return false;
}
for (i = 0; i < NUM_SEGS; i++){
seg_list[i].header = 0;                   //redundant
seg_list[i].payload.next = NULL; // to be considered as head pointer
seg_list[i].payload.prev = NULL; //redundant
}


//create blocks to mark the heap start and end within which allocated heap blocks will reside
word_t *start = (word_t *)(mem_sbrk(2 * wsize));
if (start == (void *)-1) {
return false;
}
start[0] = pack(0, true); // Heap prologue
start[1] = pack(0, true); // Heap epilogue
heap_start = (block_t *) &(start[1]);
// Extend the empty heap with a free block of chunksize bytes
if (extend_heap(chunksize) == NULL) {
return false;
}
return true;
}

Почему он вызывает ошибку seg при доступе к элементам, указанным в seg_list вне функции mm_init (), даже если она объявлена ​​как статическая глобальная переменная и имеет достаточно памяти?

Я инициализировал память как(sizeof block_t * num of buckets)

И в mm_init () он инициализируется правильно.

Но когда я вызываю его, скажем, exte_heap (), это дает segfault ..

например: seg_list [idx] .payload.next

дает ошибку segfault

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...