2014-03-30 92 views
1

我對內存池的實現感到困惑。我創建了一個內存池:在內存池中實現內存池

typedef struct POOL 
{ 
    struct POOL *p_next; 
    unsigned short size; 
    unsigned short used; 
}pool; 

pool *p; 
p=malloc(pool_size+sizeof(pool)); 
p->size= pool_size; 
p->used= 0; 

,現在我要分割此內存池與BLOCK_SIZE塊,所以

typedef struct BLOCK 
{ 
unsigned short size; 
struct BLOCK *b_next; 
}block; 

block *b=NULL; 
b=(block *)&p[block_size+sizeof(block)]; 
b->size=block_size; 
memset(b,0,size+sizeof(block)); 
p->used+=(size+sizeof(block)); 

,現在我想用塊B的內存,所以我只是使用它作爲

strcpy(b, "hello, world!"); 

我是否正確地做它?我該如何解決這個問題?

+0

什麼是'pool'?那是'struct'嗎? –

+0

是的,它是一個結構體,它包含關於池大小,池ID以及指向下一個池的指針的信息,並且該塊也是一個結構體。 – vera

+0

你需要描述你的結構更多&我希望你知道這個 - 'p'這裏是一個指針,'sizeof(pool)'是一個指針的大小,而不是指向'pool'塊的大小,同樣的事情'的sizeof(塊)'。 – brokenfoot

回答

0

在以下

b=(block *)&p[block_size+sizeof(block)]; 

p是一個指向pool,所以當你使用就可以了數組索引,偏移將由pool結構的大小相乘。這可能不是你想要的。你可能想跳過池結構,這將是剛剛

p+1 

我不知道你打算什麼樣的政策來使用池頭之後瓜分內存或者你打算如何處理對齊要求,所以我不能說超出這個額外的抵消額。

接下來,您在塊結構中填入塊大小,然後繼續使用memset擦除整個事物。所以,不知道你想要實現什麼樣的池分配器,我能做的最好的就是回答你的實際問題,答案是否定的,你沒有正確地做到這一點。

+0

下面是我想要做的:如果我有* p = malloc(1000),我想將內存p分成200和300的塊,並獲取塊的地址並使用它。我很困惑如何實現它。 – vera

+0

嘗試將您的指針轉換爲'uint8_t *'或'uintptr_t',以便您可以以字節爲單位執行算術運算,然後將它們轉換回您實際需要的類型。計算空閒地址時請記住池和塊標題。你不想在控制結構上分配一個塊! – pat