1. 程式人生 > >《C語言》單鏈表——記憶體管理

《C語言》單鏈表——記憶體管理

《C語言》單鏈表——記憶體管理

Main.c

#define SAFE_MEMORY

#include "MemManage.h"
#include <time.h>
#define N 10

void main()
{

	srand((unsigned int)time(NULL));
	void* P_Addr[N] = { NULL };

	for (int i = 0; i < N; i++)
	{
		P_Addr[i] = malloc
(rand() % 2048); } Show(P_Memory); free(P_Addr[0]); free(P_Addr[0]); free(P_Addr[0]); free(P_Addr[5]); free(P_Addr[9]); Show(P_Memory); system("pause"); }

MemManage.h

#pragma once 


#ifdef __cplusplus
extern "C"
{
#endif

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

#ifdef SAFE_MEMORY
#define malloc MyMalloc #define recalloc MyReCalloc #define free MyFree #endif typedef struct MemoryInfo { void* P_MemAddr; unsigned int MemSize; }MemoryInfo; typedef struct MemManage { MemoryInfo* P_MemInfo; struct MemManage* P_Next; }MemManage; MemManage* P_Memory; //初始化節點 void
InitNode(MemManage* P_Node); //顯示連結串列狀態 void Show(MemManage* P_Head); //新增節點(新增記憶體) void Append(MemManage** PP_Head, MemoryInfo* P_MemInfo); //查詢節點 MemManage* FindNode(MemManage* P_Head, void* P_Addr); //修改節點 void Modification(MemManage* P_Head, void* P_Addr, MemoryInfo* P_NewMem); //刪除節點 void DeleteNode(MemManage** PP_Head, MemoryInfo* P_DelAddr); //分配記憶體 void* MyMalloc(size_t MemSize); //擴充套件記憶體 void* MyReCalloc(void* P_OldAddr, size_t NewSize); //釋放記憶體 void MyFree(void* P_Addr); #ifdef __cplusplus } #endif

MemManage.c

#include "MemManage.h"



//初始化節點
void InitNode(MemManage* P_Node)
{
	if (NULL != P_Node)
	{
		P_Node->P_MemInfo = NULL;
		P_Node->P_Next = NULL;
	}

}

//顯示連結串列狀態
void Show(MemManage* P_Head)
{
	if (NULL == P_Head)
	{
		puts("");
		return;
	}
	else
	{
		printf("%p\t%p\t%p\t%u\n", P_Head, P_Head->P_Next, P_Head->P_MemInfo->P_MemAddr, P_Head->P_MemInfo->MemSize);
		Show(P_Head->P_Next);
	}
}

//新增節點(新增記憶體)
void Append(MemManage** PP_Head, MemoryInfo* P_MemInfo)
{
	MemManage* P_New = (MemManage*)malloc(sizeof(MemManage));
	InitNode(P_New);
	P_New->P_MemInfo = P_MemInfo;

	if (NULL == *PP_Head)
	{
		*PP_Head = P_New;
	}
	else
	{
		MemManage* P_Bak = *PP_Head;
		while (NULL != P_Bak->P_Next)
		{
			P_Bak = P_Bak->P_Next;
		}
		P_Bak->P_Next = P_New;
	}
}

//查詢節點
MemManage* FindNode(MemManage* P_Head, void* P_Addr)
{
	if (NULL == P_Head || NULL == P_Addr)
	{
		return NULL;
	}
	else
	{
		while (NULL != P_Head)
		{

			if (P_Addr == P_Head->P_MemInfo->P_MemAddr)
			{
				return P_Head;
			}
			P_Head = P_Head->P_Next;
		}
	}
	return NULL;
}

//修改節點(擴充套件記憶體)
void Modification(MemManage* P_Head, void* P_Addr, MemoryInfo* P_NewMem)
{
	if (NULL != P_Head)
	{
		MemManage* P_Res = FindNode(P_Head, P_Addr);
		if (NULL != P_Res)
		{
			P_Res->P_MemInfo = P_NewMem;
		}
	}

}

//刪除節點(釋放記憶體)
void DeleteNode(MemManage** PP_Head, MemoryInfo* P_DelAddr)
{
	if (NULL != *PP_Head)
	{
		MemManage*P_Res = FindNode(*PP_Head, P_DelAddr->P_MemAddr);
		if (NULL != P_Res)
		{
			if (P_Res == *PP_Head)
			{
				*PP_Head = (*PP_Head)->P_Next;

				free(P_Res->P_MemInfo->P_MemAddr);
				P_Res->P_MemInfo->P_MemAddr = NULL;
				free(P_Res);
				P_Res = NULL;
			}
			else
			{
				MemManage* P_Bak = *PP_Head;
				while (P_Bak->P_Next != P_Res)
				{
					P_Bak = P_Bak->P_Next;
				}

				free(P_Res->P_MemInfo->P_MemAddr);
				P_Res->P_MemInfo->P_MemAddr = NULL;
				P_Bak->P_Next = P_Res->P_Next;
				free(P_Res);
				P_Res = NULL;
			}
		}
	}
}

//分配記憶體
void* MyMalloc(size_t MemSize)
{
	MemoryInfo* P_New = (MemoryInfo*)malloc(sizeof(MemoryInfo));
	P_New->MemSize = MemSize;
	P_New->P_MemAddr = malloc(MemSize);
	Append(&P_Memory, P_New);

	return P_New->P_MemAddr;
}

//擴充套件記憶體
void* MyReCalloc(void* P_OldAddr, size_t NewSize)
{
	MemoryInfo* P_New = (MemoryInfo*)malloc(sizeof(MemoryInfo));
	P_New->MemSize = NewSize;
	P_New->P_MemAddr = realloc(P_OldAddr, NewSize);
	Modification(P_Memory, P_OldAddr, P_New);

	return P_New->P_MemAddr;
}

//釋放記憶體
void MyFree(void* P_Addr)
{
	MemManage* P_Res = FindNode(P_Memory, P_Addr);
	if (NULL != P_Res)
	{	
		DeleteNode(&P_Memory, P_Res->P_MemInfo);
	}
}