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"));
}
#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"));
}
相关文章推荐
- malloc/free and new/delete 工作机制
- malloc/free and new/delete in C++
- [ZT]10 Completely Free Wireframing and Mockup Tools
- Effective C++(Item3) Prefer new and delete to malloc and free
- c之指针与数组(2)Dynamic Data Structures: Malloc and Free--转载
- calloc, malloc, free, realloc - Allocate and free dynamic memory
- C Language: malloc and free
- hash_malloc and free
- [zt] 有了malloc/free为什么还要new/delete?
- [ZT]Addison Wesley's Free Chapters and Articles
- malloc and free
- c之指针与数组(2)Dynamic Data Structures: Malloc and Free--转载
- Malloc And Free
- C++ Memory Management : What is the difference between malloc/free and new/delete?
- malloc, free, new and delete
- C/C++ Basic-- the differs between [malloc&free] and [new &delete]
- What is the difference between new/delete and malloc/free?
- Java equivalents of malloc(), new, free() and delete
- malloc/free and new/delete in C++
- malloc and free