2012-07-10 96 views
1

我想在C中建立一個內存分配器。用戶開始說他要使用多少內存,以及可用內存的最小塊大小。內存分配的結構指針陣列

因此,例如,假設用戶請求具有8B的最小塊大小的1024B。 這意味着可能的塊大小將是1024,512,256,128,64,32,16和8.

爲了跟蹤內存的空閒塊,我有一個指向結構的指針數組。這些結構被稱爲Header,並且該數組被稱爲FreeList。 我的意思是說,FreeList [0]將包含一個指向內存中存在大小爲8的內存空間的指針.FreeList [1]將包含一個指向內存空間的指針,其中有一塊內存大小16.等

typedef void * Addr; 
struct Header 
{ 
    Addr next; 
    int order; 
}; 

struct Header *FreeList[]; 

我想分配內存此空閒列表下面的代碼使用方法:

FreeList = malloc(Order*sizeof(struct Header)); 

哪裏訂單是您可以有不同的塊大小的數量。

我收到編譯錯誤'FreeList'有一個不完整的類型。

我不希望這些指針指向任何地方,我只是想分配數據空間。

+2

這是真碼嗎?您在結構定義的末尾缺少';'。如果它是一個指針數組,那麼數組的大小是多少?爲什麼你沒有在索引中指定任何內容? – Mahesh 2012-07-10 21:03:47

+0

我很抱歉。錯字。修復。 – user1515928 2012-07-10 21:05:30

+0

是否包含在執行分配的翻譯單元(.c)中的「Header」的定義?如果不是,'Header'只能用作指針 - 編譯器不知道它的大小。 – eran 2012-07-10 21:06:19

回答

7

在C語言

struct Header *FreeList[]; 

爲未知大小(不完全型)的靜態陣列的暫定定義。這個數組應該稍後用已知的編譯時間大小來定義。重點是它是一個靜態陣列。它不是由malloc「可分配」。

如果需要,可以在運行時通過malloc分配指針數組,必須聲明指針到指針變量

struct Header **FreeList; 

其是後者具有適當大小

分配
FreeList = malloc(Order * sizeof *FreeList); 

請注意,在這種情況下,您正在分配一組指針,就像您想要的一樣。而上述分配中的sizeof相當於sizeof(struct Header *)。即指針的大小(而不是原始代碼中的錯誤sizeof(struct Header))。

這又一次分配了未初始化指針的數組。初始化這些指針是你的責任,也就是讓它們指向任何你希望它們指向的地方。如有必要,您還必須爲實際標題分配內存。


然而,這是不是從你貼什麼真正清楚是否真的需要的指針數組頭或者,也許,的真實頭部的數組。你的解釋很混亂,有時會自相矛盾。如果你需要實際的頭的數組,然後將鼠標指針的聲明和分配將如下所示

struct Header *FreeList; 
... 
FreeList = malloc(Order * sizeof *FreeList); 

在這種情況下sizeof表達上述相當於sizeof(struct Header),在我們原來的例子。請記住,分配的標題數組尚未初始化。

+0

謝謝你的作品。 我只需要一個指向數組的指針數組。標題本身在用戶內存中。 – user1515928 2012-07-10 21:14:04