2016-09-22 9 views
1

Я пытаюсь инициализировать блок кучи пространства на несколько небольших блоков фиксированного размера без использования malloc. Каждый блок указывает на следующий блок. В принципе, это родной список, не используемый malloc. Структура выглядит так:Как инициализировать и манипулировать указателем адреса

/******** Memory Table Entry Data Structure**********/ 
typedef struct 
{ 
    ????? block_address; //<- What datatype should I use here? 
    void* next_free_block; 

}mem_table_entry_t; 

/******** Memory Table Data Structure**********/ 
typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 

}mem_table_t; 

линкер делает начальный адрес кучи для использования программы через внешнюю переменную _sys_memory, например, так:

extern void* _sys_memory; // Start of system memory 

В моей процедуре инициализации, Я хочу сделать указатель и указать на адрес тот же адрес, что и _sys_mem. Позже я хочу увеличить указатель на 2048 и назначить это значение стартовому адресу следующего блока. Каким типом данных я должен пользоваться и как его можно манипулировать?

#include <stdint.h> 
#include "mem_manager.h" 

mem_table_t memory_table; 

void mem_initialize(void) 
{ 
    int block_count = 0; 

    void *dynamic_address; 

    dynamic_address = _sys_memory; 

    while(block_count < 8) 
    { 

     memory_table.two_kib[block_count].block_address = dynamic_address; 
     dynamic_address = (&dynamic_address + 0x800); 

     memory_table.two_kib[block_count].next_free_block = dynamic_address; 
     block_count++; 
    } 
+1

Пожалуйста, скажите мне, что мотивация для этого –

+0

@EdHeal - Она является частью университетского курса. В этом конкретном задании нам необходимо создать собственные функции malloc() и free(). В конкретном оборудовании, которое мы используем, 80 килобайт кучного пространства должно быть нарезано на различные фиксированные размеры. Реализация моего дизайна редко проходит гладко .... lol – Darrell

+0

Этот курс кажется действительно интересным, я имею в виду реализацию своего собственного malloc(), мне бы очень хотелось увидеть, как только вы его завершите !! @Darrell –

ответ

0

В вашей идее есть некоторая двусмысленность (вы не указали много деталей о реализации реализации malloc). Во всяком случае, вы совершили ошибку, когда вы писали

dynamic_address=(&dynamic_address+0x800) 

Причина должна быть:

dynamic_address = dynamic_address + 0x800 
+0

Да, я так понял. Когда я вношу изменения, которые вы предложили, возникает ошибка компиляции: «выражение должно быть указателем на полный тип объекта». Мысли? – Darrell

 Смежные вопросы

  • Нет связанных вопросов^_^