内存分配管理的代码用C实现
来源:优易学  2011-12-10 17:10:33   【优易学:中国教育考试门户网】   资料下载   IT书店


  /*清空链表*/
  int FreeChain()
  {
  struct Node *first=chain.first;
  struct Node *tp1=NULL;
  while(first)
  {
  tp1=first->nextNode;
  free((void *)*(first->varAddr));
  free(first);
  first=tp1;
  }
  chain.first=NULL;
  chain.last=NULL;
  chain.size=0;
  return 1;
  }

  /*
  自定义的malloc,calloc,realloc,free函数
  void **p参数 是存储分配内存地址的变量的地址,根据这个地址与分配内存关联,进行管理
  */
  void* MyMalloc(void **p,int size)
  {
  struct Node *pn=NULL;
  (*p)=malloc(size);
  if(p==NULL)
  return NULL;
  pn=InitNode(pn);
  if(pn==NULL)
  return NULL;
  pn->varAddr=p;
  pn->size=size;
  Push(pn);
  return (*p);
  }
  void* MyCalloc(void **p,int nsize,int usize)
  {
  struct Node *pn=NULL;
  (*p)=calloc(nsize,usize);
  if(p==NULL)
  return NULL;
  pn=InitNode(pn);
  if(pn==NULL)
  return NULL;
  pn->varAddr=p;
  pn->size=nsize*usize;
  Push(pn);
  return (*p);
  }
  void* MyRealloc(void **p,int size)
  {
  struct Node *pn=NULL;
  (*p)=realloc((*p),size);
  if(p==NULL)
  return NULL;
  pn=InitNode(pn);
  if(pn==NULL)
  return NULL;
  pn->varAddr=p;
  pn->size=size;
  RemoveChain(p);
  Push(pn);
  return (*p);
  }
  void MyFree(void **p)
  {
  if((*p)==NULL)
  return;
  free((*p));//释放内存
  RemoveChain(p);//把相关节点从链表移除
  }
  int main()
  {
  char *p=NULL;
  char *p2=NULL;
  int *p3=NULL;
  InitChain();
  p=MyCalloc(&p,100,sizeof(char));
  strcpy(p,"abcdefgh...");
  p2=MyMalloc(&p2,18*sizeof(char));
  p3=MyMalloc(&p3,10*sizeof(int));
  p3=MyRealloc(&p3,20*sizeof(int));
  MyFree(&p2);
  FreeChain();
  return 0;
  }

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训