該實現使用大容量的靜態陣列作為堆,但也可使用作業系統呼叫分配堆。定義了乙個資料型別header儲存每個儲存器塊的簿記資訊,定義了具有header型別元素的堆陣列,這樣就可以很容易地將簿記資訊儲存在儲存器塊中。型別header包含了3塊資訊:指向列表的下乙個塊的指標,當前分配空間的長度,後面的自由空間的長度。另外,型別header的定義還使用了乙個union宣告和align資料型別,這是將儲存器元素排在合理的位元組邊界上,根據系統的不同,這有時是需要的,有時是不需要的。
在malloc函式中,當申請空間時,至少要分配兩個header元素節點,有什麼原因嗎?當然有,因為每個空間塊都包含兩部分:空間頭和空間體。空間頭是為維護堆而設計的,說到底就是維護已用空間鍊錶,為搜尋空閒空間和釋放已用空間服務。空間體是供使用者讀寫的,當malloc函式返回給使用者乙個指標時,使用者就可以設定自己的規格,比如強制轉換成int或double型別,接下來就可以按照這種規格進行讀寫了。需要注意一點,空間頭是不能被使用者訪問的,它是用來維護堆的,不是為使用者服務的,所以malloc函式返回的指標是指向空間體的,而不是指向空間頭的,理所當然free函式得到的指標也是指向空間體的。可是為了釋放空間,free函式需要得到該空間的空間頭資訊,所以實現時需要把指標調整一下,改為指向空間頭,此情形下,加一即可。另外一點,空間頭和空間體同為header型別,用union宣告再合適不過。下面就是malloc函式和free函式的實現**:
#define null 0
#define memseze 8096
typedef double align;
typedef union header
s;align a;
}header;
static header mem[memsize];
static header* memptr=null;
void* malloc(unsigned nbytes)
for(p=memptr;(p->s.next!=memptr) && (p->s.freesizes.next);
if(p->freesizes.usedsize;
newp->s.usedsize=nunits;
newp->s.freesize=p->s.freesize-nunits;
newp->s.next=p->s.next;
p->s.freesize=0;
p->s.next=newp;
memptr=newp;
return (void*)(newp+1);
}void free(void* ap)
C語言中 malloc函式用法
一 malloc 和free 的基本概念以及基本用法 1 函式原型及說明 void malloc long numbytes 該函式分配了numbytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回乙個空指標 null 關於分配失敗的原因,應該有多種,比如說空間不足就是一種。void...
c語言中的malloc
今天想去練習一下二叉樹的使用的,使用前就必須要建立乙個二叉樹啊。我用的是前序式的建立方法,都是通過呼叫子函式createtree來建立乙個樹 先建立根 左孩子 右孩子 是通過遞迴的方法的。但是當我測試的時候,每次訪問樹根的都會出錯,原來建立的二叉樹根本就沒有儲存在主函式的head中,我用單步除錯發現...
C語言中的malloc與free函式
malloc函式的作用是在堆中開闢一塊指定大小的空間。如果開闢成功,返回空間首個位元組位址,失敗則返回null。free函式能夠釋放在堆中開闢的記憶體空間,傳入乙個任意型別的指標變數,指向指向被釋放區域的首位址。被釋放區域應是有malloc開闢的空間。需要注意的是 free釋放記憶體空間只是失去了對...