2013-07-09 2 views
4

Я пишу свой собственный таНос() и я уже понял следующеенаписать собственный таНос

struct myblock 
{ 
    struct myblock *next; 
    struct myblock *prev; 
    int isFree; 
    unsigned availablesize; 
    char *buffer; 
} 

и пространства #define MEM_BUFFER (1024), который будет «мой баран». и если я не ошибаюсь, то я бы

char *array[MEM_BUFFER]; 

иметь массив из 1024 байт (любезно исправьте меня, если я ошибаюсь).

Как мы знаем, MEM_BUFFER также будет содержать матадаты занимаемого пространства. Я немного смущен, что мне следует начинать.

Это мой главный вопрос. следует назначить структуру массиву для каждого запроса на распределение (если да, то из массива struct char?).

Должен ли я обрабатывать двойной связанный список в куче и пропускать байты sizeof (myblock) из массива.

Я думаю об этом решении последние 2 дня, и я все еще смущен.

ответ

6

Нет,

char *array[MEM_BUFFER]; 

не является массивом из 1024 байт (если MEM_BUFFER не установлен 1024/sizeof (char *)), как правило. Это массив MEM_BUFFER персонаж указатели.

Вам нужно только:

char array[MEM_BUFFER]; 

хотя лучше бы имя heap_space.

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

struct myblock *heap = (struct myblock *) heap_space; 

Затем можно инициализировать, что:

heap->next = NULL; 
heap->prev = NULL; 
heap->isFree = 1; 
heap->availablesize = sizeof heap_space - sizeof *heap; 

Не уверен, что должен делать struct myblock.buffer , Я положил блоки внутри кучу, чтобы память пользователя для блока была (void *) (block + 1);

+0

@unwind .. большое спасибо, чтобы дать мне направление, и я начал работать. мой второй вопрос: struct myblock * heap = (struct myblock *) heap_space; так мы можем начать с создания корневого узла по типу casting heap_space, но как насчет второго узла, я имею в виду, когда начнутся rquests? как я создам второй узел, чтобы начать работать. То же, что мы создаем сначала или ... как? – abidkhan303

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