2013-07-09 79 views
4

我寫我自己的malloc(),我已經想通了以下寫你自己的malloc

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也會包含佔用空間的matadata。我有點困惑,我該如何開始。

這是我的主要問題。 我應該將結構分配給每個分配請求上的數組(如果是,那麼從結構字符數組?)。

我應該處理堆上的雙鏈表並跳過數組中的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;這是我們如何開始通過類型轉換heap_space來創建根節點,但是第二個節點呢,我的意思是什麼時候rquests將會開始呢?我將如何創建第二個節點來開始工作。我們正在創造第一個還是......如何? – abidkhan303