您的位置:首页 > 其它

my_free and my_malloc(ZT)

2005-10-27 10:37 253 查看
#include <stdio.h>
#include <memory.h>
#define HEAP_SIZE 200
#define PAGE_SIZE 68
#define SIZE_MASK 0x7fffffff
#define USED_MASK 0x80000000
#define LY_DBG(x) x
#pragma pack(1)
struct Page_Index{
Page_Index* pPre_Page_Index;
unsigned int ucBlock_Size;
};
#pragma pack()
void *my_malloc(size_t size);
void my_free(void *memblock);
void output_bytes(unsigned int data_size,unsigned char *buf);
bool mem_init(unsigned char* mem_to_init,size_t mem_size_to_be_inited);
static unsigned char heap[HEAP_SIZE]={0};

void main(){
unsigned char *p[10];
int i;
mem_init(heap,HEAP_SIZE);

for(i=0;i<10;i++){
p[i]=(unsigned char*)my_malloc(1);
printf("p[%d]=%p/n",i,p[i]);
}
//output_bytes(HEAP_SIZE,heap);
return;
}
void my_free(void *memblock){
unsigned char * s;
unsigned char * r;
unsigned char * q;
unsigned char * p=(unsigned char *)memblock-sizeof(Page_Index);
if(memblock==NULL||(!((((Page_Index*)p)->ucBlock_Size)&USED_MASK)) ){
printf("Invalid arg of free./n");
return;
}
(((Page_Index*)p)->ucBlock_Size)&=SIZE_MASK;
q=p+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index);

if(((((Page_Index*)q)->ucBlock_Size)!=0))//((((Page_Index*)q)->ucBlock_Size)==0) none to think;
if(!((((Page_Index*)q)->ucBlock_Size)&USED_MASK)){//((((Page_Index*)q)->ucBlock_Size)&USED_MASK)==1 none to think;
r=q+((((Page_Index*)q)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index);
(((Page_Index*)p)->ucBlock_Size)=((((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index)+((((Page_Index*)q)->ucBlock_Size)&SIZE_MASK))&SIZE_MASK);
(((Page_Index*)r)->pPre_Page_Index)=(Page_Index*)p;
}
else{
s=(unsigned char*)(((Page_Index*)p)->pPre_Page_Index);
if(s!=NULL){
if(((((Page_Index*)s)->ucBlock_Size)!=0))
if(!((((Page_Index*)s)->ucBlock_Size)&USED_MASK)){
(((Page_Index*)q)->pPre_Page_Index)=(Page_Index*)s;
//r=(unsigned char*)(((Page_Index*)s)->pPre_Page_Index);
(((Page_Index*)s)->ucBlock_Size)+=(((Page_Index*)p)->ucBlock_Size)+sizeof(Page_Index);
(((Page_Index*)s)->ucBlock_Size)&=SIZE_MASK;
}
}
}
else{
s=(unsigned char*)(((Page_Index*)p)->pPre_Page_Index);
if(s!=NULL){
if(((((Page_Index*)s)->ucBlock_Size)!=0))
if(!((((Page_Index*)s)->ucBlock_Size)&USED_MASK)){
r=p+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK);
(((Page_Index*)r)->pPre_Page_Index)=(Page_Index*)s;
(((Page_Index*)s)->ucBlock_Size)+=((((((Page_Index*)s)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index)+((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK))&SIZE_MASK);
}
}
}
}

void *my_malloc(unsigned int size){
Page_Index* pPage_Index=(Page_Index*)heap;
unsigned char * p=(unsigned char *)pPage_Index;
unsigned char * q;
unsigned char * r;
unsigned int next_page_size;
Page_Index Temp_Page;
if(size<=0||size>(HEAP_SIZE-sizeof(Page_Index)*2))
return NULL;
while(((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)!=0){
r=p;
if((!(((Page_Index*)p)->ucBlock_Size&USED_MASK))&&((((Page_Index*)p)->ucBlock_Size)>=size))
{
if((next_page_size=(((Page_Index*)p)->ucBlock_Size&SIZE_MASK)-size)>sizeof(Page_Index)){
((Page_Index*)p)->ucBlock_Size=size|USED_MASK;
q=p+sizeof(Page_Index)+size;
((Page_Index*)q)->pPre_Page_Index=(Page_Index*)p;
((Page_Index*)q)->ucBlock_Size=(next_page_size-sizeof(Page_Index))&SIZE_MASK;
p=q+sizeof(Page_Index)+((Page_Index*)q)->ucBlock_Size;
((Page_Index*)p)->pPre_Page_Index=(Page_Index*)q;
}
((Page_Index*)r)->ucBlock_Size|=USED_MASK;
return r+sizeof(Page_Index);
}
else
p+=(((((Page_Index*)p)->ucBlock_Size)&SIZE_MASK)+sizeof(Page_Index));
}
return NULL;
}
bool mem_init(unsigned char* mem_to_init,size_t mem_size_to_be_inited){
Page_Index Temp_Page;

Temp_Page.pPre_Page_Index=NULL;
unsigned char *p=mem_to_init;
if(mem_to_init==NULL){
printf("Invalid heap pointer./n");
return true;
}
if(mem_size_to_be_inited<2*sizeof(Page_Index)){
printf("Invalid heap size./n");
return true;
}
Temp_Page.ucBlock_Size=(mem_size_to_be_inited-2*sizeof(Page_Index))&SIZE_MASK;
memcpy(p,&Temp_Page,sizeof(Page_Index));
printf("mem_to_init=%p/n",mem_to_init);
printf("p=%p/n",p);
p+=(Temp_Page.ucBlock_Size+sizeof(Page_Index));
printf("p=%p/n",p);
Temp_Page.pPre_Page_Index=(Page_Index*)mem_to_init;
Temp_Page.ucBlock_Size=0x00000000&SIZE_MASK;
memcpy(p,&Temp_Page,sizeof(Page_Index));
return false;
}
void output_bytes(unsigned int data_size,unsigned char *buf)
{
int i;
for (i = 0; i < data_size; i++) {
LY_DBG(printf("%02X ", buf[i]));
if (((i+1) & 0x0000000F) == 0 && i != 0)
LY_DBG(printf("/t%d/n", i+1));
}
LY_DBG(printf("/n"));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: