2014-03-01 166 views
2

我需要自制一個malloc簡化了一下。內存池只是一個無符號字符數組。我打算有一個頭是一個結構,包含內存塊的大小,一個標誌('A'分配,'F'免費)和一個指向下一個頭的指針(雖然我猜這不是'因爲你已經有了塊的長度)C寫入數組結構

任何人,我不知道如何輕鬆地將結構存儲在內存池中。這是我當前的代碼:

#include <stdlib.h> 
#include <stdio.h> 

#include "ex1.h" 

#define POOL_SIZE 500 


unsigned char mem_pool[POOL_SIZE]; 
unsigned char *ptr = &mem_pool[0]; 

typedef struct header Header; 

Header h; 

struct header{ 
    int size; 
    char flag; 
    Header * next; 
}; 

void ma_init(){ 
    h = (Header){ .size = POOL_SIZE - sizeof(Header), .flag = 'F', .next = NULL}; 
} 

現在ofcourse的h頭是不是mem_pool內。邏輯上,int初始化應該是mem_pool[0] = (Header){ ...,因爲這是mem_pool的第一個字段。當然,我可以將指針放入數組中,但這會破壞具有mem_pool的指針。

那麼我應該如何存儲一個結構(或其他)在數組的某個位置?

+0

可能是分配記錄的鏈接列表,既可以在池的開始位置,也可以在池外? –

回答

2

你的內存池只是一塊分配的內存,你可以自由地以任何你想要的方式處理和解釋該內存的任何部分,你只需要在你的簿記中小心。

所以,你可以宣佈你的內存池的第一個字節是你的頭結構的第一個字節:

struct header *h = (struct header *)mem_pool; 
h->flag = 'F'; 
// this will be set after you allocate the first block 
// you would set it to h + sizeof(struct header) + allocation size 
h->next = NULL;  

所以只要你有你的斑點和你的尺寸的開始/指針是正確的,您可以繼續投射適當的內存塊作爲您的struct

+2

只有當'mem_pool'正確對齊'struct header *'時,這纔有效,否則行爲是不確定的。由於'mem_pool'是一個字符類型的數組,它可能沒有正確的對齊方式。確保mem_pool具有正確對齊的一種方法是使其成爲還包含指針的聯合的成員。或者,如果池被分配了'malloc',也可以工作,因爲'malloc''內存保證能夠正確對齊任何類型。 –