2011-03-07 61 views
0

我寫一個簡單的函數庫池,這將作爲一個參數被我的其他功能來管理內存的大小。初始化數據結構用C來管理內存

我有保持由用戶初始化的這個大的存儲器池的信息的數據結構。

typedef struct memBlock{ 
    struct memBlock* next; 
    unsigned int size; // Size of this block 
    unsigned int is_used; // bool 0 = not used 1 = used 
} memBlock; 

我也有這個功能,我正在試圖找出如何初始化這個數據結構以及分配足夠的空間來進行初始管理?

int initialize_memory(unsigned long size){ 

    memBlock *ptr; // the beginning of our whole memory to be handled 

    ptr = malloc(size); // this is the ptr to the original memory first allocated. 
    ptr->next = NULL; 
    ptr->size = NULL; 
    ptr->is_used = 0; 

    has_initialized = 1; // the memory has been initialized 
} 

請幫助

+2

對不起,有什麼問題?我們無法知道內存池中需要多少內存。在那兒? :) – 2011-03-07 20:12:51

+1

而問題是...? (「請幫忙」不計。) – dappawit 2011-03-07 20:27:29

+0

對不起這裏的含糊不清的問題,在我的initialize_memory功能我有一個大的內存池時調用該函數將被保留。我想弄清楚初始化調用(ptr-> next ....)在開始時是否正確?基本上我還有另一個函數,它將像'malloc'一樣保留大量的字節,但是會首先檢查這個數據結構,看看我的池中是否有任何內存可用?我的基本問題是,在從我的ptr分配任何內存之前,是否在開始時正確初始化了此數據結構? – Warz 2011-03-07 20:42:07

回答

1

變化ptr->size = NULL;ptr->size = size;。您還需要退回ptr,或將其存儲在某個地方。你的函數返回int,但你不返回任何東西。 has_initialized似乎沒有必要 - 你知道你已經初始化,因爲你的內存池(在ptr值將返回)不NULL。如果你需要更多的幫助,你將不得不解釋更多。

附錄:您需要確定memBlock.size是否爲分配空間的大小或由memBlock表示的內存塊的大小......如果是後者,則需要考慮佔用的空間大小通過減去關閉的你分配的空間量memblock本身:ptr->size = size - sizeof(struct memBlock);您還需要一種方法來解決你的內存池......因爲緊跟在memBlock,其地址是(ptr + 1)&ptr[1](如果你不明白,看看C「中的指針運算)。

P.S.你在評論中寫道:「基本上,我還有另一個功能,它將像'malloc'一樣保留大量的字節,但會首先檢查這個數據結構,看看我的池中是否有任何內存可用。」

想要那樣做?考慮到投入的技能水平和時間,malloc已經比你的函數更好地管理內存,並且在其上層疊另一個內存分配器沒有意義。除非這是一個編寫內存分配器的學校項目,在這種情況下,你應該先說。

+0

再一次很好的解釋,我有has_initialized行來調用初始化函數,如果有人試圖調用我正在編寫的「分配函數」,而沒有每次分配一定級別的內存將被管理。我寫這個函數是爲一個課程,但我不是說任何人給我的答案。還有更多的問題,爲了解決我提到的內存池(ptr + 1)作爲查看通過初始化的方式記憶。如果有人試圖從我的內存池中分配比當前可用的空間大的空間,那麼如何檢查c? – Warz 2011-03-07 23:42:02

+0

@Warz你的內存池是一個鏈表。在任意分配和釋放序列之後,您可以在該列表中結束幾個空閒塊(谷歌「碎片」;也可以谷歌「合併」,與malloc或內存分配結合使用)。您需要在列表中搜索足夠大的空閒塊以容納所需的大小(谷歌「優先適合」和「最適合」)。如果有人試圖分配超過可用數量的數據,則會知道該搜索會失敗(這是在malloc返回NULL時發生的情況)。 – 2011-03-08 00:25:42

+0

@Warz「你提到了(ptr + 1)作爲查看初始化內存的方式」不,我不是這麼說的。您從列表頭開始查看塊(應該由'initialize_memory'返回或存儲的值)並跟隨'next'鏈接。給定一個指向某個memBlock的'struct memBlock * ptr',您可以通過字段名稱訪問'next'和'size',但是如何訪問自由內存本身?這可以通過'(void *)&ptr [1]'完成 - 這是一個指向memBlock頭部之外的第一個字節的指針。 – 2011-03-08 00:33:05

0
typedef struct memBlock { 
    unsigned int size; 
    unsigned int initialized; 
    void* block; 
} memBlock; 

memBlock* new_memBlock(unsigned int size) 
{ 
    memBlock* memblock; 

    memblock = malloc(sizeof(memBlock)); 

    if (memblock) 
    { 
     memblock->size = size; 
     memblock->block = malloc(size); 

     if (memblock->block) 
      memblock->initialized = 1; 
    } 

    return memblock; 
} 

void free_memBlock(memBlock** memblock) 
{ 
    if (*memblock) 
    { 
     free(*memblock->block) 
     *memblock->block = 0; 
    } 

    free(*memblock); 
    *memblock = 0; 
} 

void main() 
{ 
    memBlock* memblock = new_memBlock(1024); 

    if (memblock && memblock->initialized) 
     printf("Initialized\n"); 
    else 
     printf("Not initialized\n"); 

    free_memBlock(&memblock); 
} 
+0

這真的不是OP想要的...注意'struct memBlock'中的'next'字段和函數名'initialize_memory'。這個想法是維護空閒內存塊的池(或malloc術語中的「競技場」),並且'initialize_memory'初始化池。並且雙'malloc'不是必須的.​​.....'struct memBlock'是一個頭文件,並且可用內存可以簡單地在'(ptr + 1)'處跟隨它......就像malloc的大多數實現一樣。 – 2011-03-07 21:12:50

+0

對我的評論的更正:實際上它是一個免費和分配塊的競技場 - 注意'is_used'標誌。空閒和分配的塊在內存中彼此相鄰,並且大概空閒塊在釋放時被合併。至少,這就是malloc的工作原理,這似乎只是一個malloc的實現。 – 2011-03-07 21:23:58