Как получить доступ к заголовку для блока памяти с помощью арифметики указателя? - PullRequest
0 голосов
/ 28 марта 2019

Я работаю над проблемой домашней работы, которая состоит в создании программы на 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.

1 Ответ

0 голосов
/ 28 марта 2019

placeOfHeader не находится где-то в выделенном регионе. Вы, вероятно, хотите написать что-то вроде этого.

//alloc(realSize)
void *placeOfHeader = malloc(realSize);
*((size_t*)placeOfHeader) = realSize;
void* startOfMemory = (size_t*)placeOfHeader + 1;
return startOfMemory;

//free(startOfMemory)
void* placeOfHeader = (size_t*)startOfMemory - 1;
size_t realSize = *((size_t*)placeOfHeader);
free(placeOfHeader)
...