Я рассматриваю реализацию распределителя с использованием явного свободного списка и удивляюсь, почему многие люди использовали 48 байтов в качестве исходного размера.
Но большинство людей использовали 48 НЕ 24
#define PACK(size, alloc) ((size) | (alloc))
#define PUT(p, val) (*(size_t *)(p) = (val))
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define OVERHEAD 24
static char *heap_listp; /* pointer to first block */
static char *mem_brk; /* pointer to last byte of heap plus 1 */
void *mem_sbrk(int incr){
char *old_brk = mem_brk;
mem_brk +=incr;
return (void *)old_brk;
}
int mm_init(void)
{
if((heap_listp = mem_sbrk(48) == NULL){ //Return error if unable to get heap space
return -1;
}
PUT(heap_listp, 0);
//Put the Padding at the start of heap
PUT(heap_listp + WSIZE, PACK(OVERHEAD, 1));
//Put the header block of the prologue
PUT(heap_listp + DSIZE, 0);
//Put the previous pointer
PUT(heap_listp + DSIZE + WSIZE, 0);
//Put the next pointer
PUT(heap_listp + OVERHEAD, PACK(OVERHEAD, 1));
//Put the footer block of the prologue
PUT(heap_listp + WSIZE + OVERHEAD, PACK(0, 1));
//Put the header block of the epilogue
if(extend_heap(CHUNKSIZE / WSIZE) == NULL){ //Return error if unable to extend heap space
return -1;
}
return 0;
}
Я думаю, что мыдостаточно иметь 6 слов (заполнение, блок заголовка пролога, блок нижнего колонтитула пролога, предыдущий указатель, следующий указатель и блок заголовка эпилога) Так что я думаю, что нам нужно объявить как
if((heap_listp = mem_sbrk(24)) == NULL)
Пожалуйста, не стесняйтесь указывать, чтоЯ пропал.