/*清空链表*/
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;
}
责任编辑:小草