链式管理内存

mem.h

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

struct MEM
{
	void *p;
	size_t size;

};
typedef struct LinkNode
{
	struct MEM *mem;
	struct LinkNode *pNext;

}node,*PNODE;

struct LinkNode *phead;//声明
void *mymalloc(size_t size);
void *myrealloc(void *p, size_t size);
void myfree(void *p);
PNODE findit(PNODE phead, void *pfind);
PNODE addback(PNODE phead, struct MEM *pmem);//插入一个数据
PNODE change(PNODE phead, void *pfind, struct MEM *pnewmem);//修改
PNODE deletenode(PNODE phead, void *paddr);//删除
void showall(PNODE phead);
void getinfo(PNODE phead);
PNODE deleteall(PNODE phead);










mem.c

#include"mem.h"

struct LinkNode *phead=NULL; //实现

void *mymalloc(size_t size)
{
	void *p = malloc(size);
	//printf("\n内存地址%p存储了%d的内存", p, size);
	struct MEM *pmem = malloc(sizeof(struct MEM));
	pmem->p = p;
	pmem->size = size;//开辟一个节点
	phead = addback(phead, pmem);
	
	return p;

}
void *myrealloc(void *p, size_t size)
{

	void *pt = realloc(p, size);
	struct MEM mymem;
	mymem.p = pt;
	mymem.size = size;//新的内存地址大小
	phead = change(phead, p, &mymem);
	return pt;


}
void myfree(void *p)
{
	PNODE *px=findit(phead, p);
	if (px==NULL)
	{
		return;

	}
	else
	{
		deletenode(phead, p); //删除
		free(p);
	}
	
}




PNODE addback(PNODE phead, struct MEM *pmem)//插入一个数据
{
	PNODE pnew = malloc(sizeof(node));
	pnew->mem = pmem;
	pnew->pNext = NULL;//开辟一个节点

	if (phead==NULL)
	{
		phead = pnew;

	}
	else
	{
		PNODE ptemp = phead;
		while (ptemp->pNext!=NULL)
		{
			ptemp = ptemp->pNext;
		}
		ptemp->pNext = pnew;
	}
	return phead;

}
PNODE change(PNODE phead, void *pfind, struct MEM *pnewmem)//修改
{
	for (PNODE p = phead; p !=NULL;  p=p->pNext)
	{
		if (p->mem->p == pfind)
		{
			p->mem->p = pnewmem->p;
			p->mem->size = pnewmem->size;
			return phead;
		
		}
	}
	return phead;

}

PNODE findit(PNODE phead, void *pfind)
{
	for (PNODE p=phead;p!=NULL;p=p->pNext)
	{
		if (p->mem->p==pfind)
		{
			return p;
		}

	}
	return NULL;


}
PNODE deletenode(PNODE phead, void *paddr)//删除
{
	PNODE p1, p2;
	p1 = p2 = NULL;
	p1 = phead;
	while (p1!=NULL)
	{
		if (p1->mem->p == paddr)
		{
			break;
		}
		else
		{
			p2 = p1;
			p1 = p1->pNext;//备份上一个地址
		}
	}

	if (p1!=phead)
	{
		p2->pNext = p1->pNext;
		free(p1);
	}
	else
	{
		phead = phead->pNext;
		free(p1);
	}
	return phead;

}
void showall(PNODE phead)
{
	if (phead==NULL)
	{
		return;

	}
	else
	{
		printf("\nmemaddr=%p,size=%d", phead->mem->p, phead->mem->size);
		showall(phead->pNext);//遍历
	}

}

void getinfo(PNODE phead)
{
	printf("\n\n\n");
	int i = 0;//多少个地址
	int j = 0;//代表多少个字节内存
	for (PNODE p=phead;p!=NULL;p=p->pNext)
	{
		i++;
		j += p->mem->size;
		printf("\nmemaddr=%p,size=%d", p->mem->p, p->mem->size);
	}
	printf("\n目前一共%d个地址在使用,一共消耗%d内存",i,j);

}

PNODE deleteall(PNODE phead)
{
	if (phead==NULL)
	{
		return NULL;

	}
	else
	{
		PNODE p1 = NULL;
		PNODE p2 = NULL;
		p1 = phead;
		while (p1->pNext!=NULL)
		{
			p2 = p1->pNext;
			p1->pNext = p2->pNext;
			free(p2->mem->p);
			free(p2);
			
		}
		free(phead->mem->p);
		free(phead);//最后释放最后一个元素
	}


}

main.c

#include"mem.h"

#define malloc mymalloc
#define realloc myrealloc
#define free myfree


void main()
{
	
	void *p1 = malloc(1024 * 1024 * 100);
	void *p2 = malloc(1024 * 1024 * 100);
	void *p3 = malloc(1024 * 1024 * 100);
	void *p4 = malloc(1024 * 1024 * 100);
	getinfo(phead);

	realloc(p1, 200);
	printf("\n\n\n");
	getinfo(phead);

	free(p2);
	printf("\n\n\n");
	getinfo(phead);

	deleteall(phead);
	

	
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值