当前位置:   article > 正文

malloc函数详解之自己用C语言写出实现malloc()和free()功能的函数_自定义实现malloc宫娥能

自定义实现malloc宫娥能

改进版传送: (空间复杂度比较低的版本)

---------------------------------------------------------------------------------------------

malloc()函数使用来动态分配内存空间,free()用来释放内存空间,两者搭配使用,若忘记free,则可能引起内存泄漏。

为什么要自己编写malloc()函数:在嵌入式编程中,内存的大小都是有限的,考虑到成本问题,我们尽量包含少一点的函数库,减小不必要的浪费。

malloc函数实现的原理:

C语言实现过程:

首先是定义一块区域:

char memory[2000];                             //模拟一个堆空间

定义一个区块的结构体:

  1. struct block{
  2. size_t size; //区块大小
  3. int free; //是否已使用
  4. struct block *next; //指向下一个区块
  5. };

对模拟空间进行初始化:

  1. void initialize()
  2. {
  3. struct block *freeList = (void *)memory;
  4. freeList->size=2000-sizeof(struct block); //可用空间大小
  5. freeList->free=1; //1:空闲 0:使用
  6. freeList->next=NULL; //指向空
  7. }

MyMalloc()函数编写:

  1. void *MyMalloc(size_t noOfBytes)
  2. {
  3. struct block *curr,*prev;
  4. void *result;
  5. if(!(freeList->size))
  6. {
  7. initialize();
  8. }
  9. curr=freeList;
  10. while((((curr->size)<noOfBytes)||((curr->free)==0))&&(curr->next!=NULL))
  11. {
  12. prev=curr;
  13. curr=curr->next;
  14. }
  15. if((curr->size)==noOfBytes)
  16. {
  17. curr->free=0;
  18. result=(void*)(++curr);
  19. return result;
  20. }
  21. else if((curr->size)>(noOfBytes+sizeof(struct block))) //所需要的内存大小小于区块大小
  22. {
  23. split(curr,noOfBytes); //分割区块函数
  24. result=(void*)(++curr); //使用的位置
  25. return result;
  26. }
  27. else
  28. {
  29. result=NULL;
  30. return result;
  31. }
  32. }

split()函数实现:

  1. void split(struct block *fitting_slot,size_t size)
  2. {
  3. struct block *new=(void*)((void*)fitting_slot+size+sizeof(struct block)); //定义new的地址
  4. new->size=(fitting_slot->size)-size-sizeof(struct block); //定义size大小
  5. new->free=1; //设置是否工作
  6. new->next=fitting_slot->next; //独立出去,形成新的块
  7. fitting_slot->size=size;
  8. fitting_slot->free=0;
  9. fitting_slot->next=new;
  10. }

Myfree()函数:

  1. void merge()
  2. {
  3. struct block *curr,*prev;
  4. curr=freeList;
  5. while((curr->next)!=NULL)
  6. {
  7. if((curr->free) && (curr->next->free))
  8. {
  9. curr->size += (curr->next->size)+sizeof(struct block);
  10. curr->next = curr->next->next;
  11. }
  12. prev=curr;
  13. curr=curr->next;
  14. }
  15. }

  1. void MyFree(void* ptr)
  2. {
  3. if(((void*)memory<=ptr)&&(ptr<=(void*)(memory+2000)))
  4. {
  5. struct block* curr=ptr;
  6. --curr;
  7. curr->free=1;
  8. merge();
  9. }
  10. else
  11. return;
  12. }


 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号