мне нужно создать структуру freeBlock и allocBlock для явного списка […]?
Для меня это звучит как очень хорошая идея. Только не поймите неправильно совет: вам не нужны две разные структуры определения , а два разных списка. Вы можете реализовать это с помощью двух указателей, одного для свободных блоков и одного для выделенных блоков.
[…] я могу просто использовать один бит размера?
Вы можете использовать только один бит размера, если он не используется в противном случае. Если вы выберете бит 0, он будет работать только тогда, когда выделены только четные числа слов памяти.
нужна ли мне отдельная структура для верхнего / нижнего колонтитула блока?
Это зависит от вашего дизайна и алгоритма. Вы обязаны создать верхний и нижний колонтитулы?
Или я могу просто написать размер блока в верхнем / нижнем колонтитуле как *(int *)ptr = size;
?
Вы можете сделать это. Но я бы назначил данный указатель (временному) указателю на правильную структуру, а затем назначил бы значения прямо на своих местах.
void initialize(void *ptr, int size) {
memory = ptr;
header* h = memory;
h->size = size;
}
Дополнительное наблюдение: вместо
typedef struct memoryBlock{
struct memoryBlock *prev,*next;
}memoryBlock;
лучшепривыкнуть к этому, это сэкономит вам много выдернутых волос:
typedef struct memoryBlock {
struct memoryBlock *prev;
struct memoryBlock *next;
} memoryBlock;
Примечание: из-за (на первый взгляд) сложности указателя, пожалуйста, поднимите уровень предупреждения вашего компилятора домаксимум. Прочитайте все предупреждения и устраните их причины.