Я работаю над проблемой домашней работы, которая состоит в создании программы на c, которую пользователь может использовать для управления памятью. По сути, мы пытаемся имитировать то, что malloc () и free () делают по-своему. Функция, над которой я сейчас работаю, является функцией initmemory (int size), которая выделяет весь блок, который будет использовать пользователь, и из этого блока будут выделяться меньшие блоки, так как программа вызывает функцию myalloc () (в основном наша версия malloc). ()). Мой вопрос заключается в том, что я пытаюсь получить доступ к части заголовка всего блока, чтобы сохранить размер и статус распределения блока, но когда я пытаюсь выполнить арифметику указателей, я просто перемещаю один бит. Как я могу получить доступ к заголовку, чтобы сохранить размер и статус выделения блока с моей переменной указателя startOfMemory
void initmemory(int size){
printf("this is the initial size: %d\n", size);
//realSize = size + initial padding + anchorHeader + sentinelBlock
int realSize = size + 12;
printf("I am the new realSize: %d\n", realSize);
//checks how many remainders are left
int check = realSize % 8;
printf("this is the value of check: %d\n", check);
//will only change realSize if check is not zero
if(check != 0){
//adds enough bytes to satisfy 8-byte alignment
realSize = realSize + (8 - check);
/*
* this is only to make sure realSize is 8-byte aligned, it should not run
* unless the above code for some reason does not run
*/
check = realSize % 8;
while(check != 0){
realSize = realSize + (8-check);
check = realSize % 8;
printf("I'm in the while check loop");
}
}
// initializes the memory to be allocated.
void *startOfMemory = malloc(realSize);
void *placeOfHeader = startOfMemory - 1;
printf("my memory location is at: %p\n", startOfMemory);
printf("my realSize is: %d\n", realSize);
printf("memory location of placeOfHeader: %p\n", placeOfHeader);
free(startOfMemory);
}
int main(){
initmemory(5);
return 0;
}
область памяти для startOfMemory, которая вызывает функцию malloc (), находится по адресу 0x87a3008 (что имеет смысл из-за 8-байтового выравнивания)
когда я делаю арифметику с указателями, как в переменной place of header, ячейка памяти placeOfHeader находится в 0x87a3007.