//在远程linux服务器上无法用中文写注释,就没写了,英文嘛,它认识我,我不认识它。这只是一超简单的模拟版
//mini_malloc.h头文件
#include <stdio.h>
#include <stdlib.h>
#define MAXMEM 10000
typedef unsigned int size_t;
typedef struct PLACEHOLDER {
char _state;
size_t _size;
struct PLACEHOLDER *_next;
} PLACEHOLDER;
extern PLACEHOLDER *L;
extern void *P;
void *mini_malloc(size_t size);
void mini_free(void *p);
//mainApp.c主函数,主要用于测试mini_malloc和mini_free
#include "mini_malloc.h"
#define ARRAYSIZE 10
int main(int argc, char ** argv)
{
void * malloc_array[10] = {0};
int i = 1;
int j = 1;
int count = 100;
while(count-- > 0)
{
j = 1;
for(i = 1;i < ARRAYSIZE;i++)
{
if(malloc_array = mini_malloc((size_t)j))
printf("malloc 2^%d succeed!/n", i-1);
else
printf("malloc 2^%d failed!/n", i-1);
j *= 2;
}
i--;
for(;i > 0;i--)
if(malloc_array)
mini_free(malloc_array);
}
return 0;
}
//mini_malloc.c内存分配实现
#include "mini_malloc.h"
extern void *P = NULL;
extern PLACEHOLDER *L = NULL;
size_t s = 0;
void init_malloc()
{
if (P != NULL) return;
P = (void *)malloc(MAXMEM);
s = sizeof(PLACEHOLDER);
L = (PLACEHOLDER *)P;
L->_state = '/0';
L->_size = MAXMEM - s;
L->_next = NULL;
}
void *mini_malloc(size_t size)
{
init_malloc();
PLACEHOLDER *T = L;
size_t tsize = 0;
while (T) {
if (T->_state == '/0') {
//printf("%c %u %u/n", T->_state, T->_size, size);
if (size < T->_size) {
T->_state = 1;
tsize = T->_size;
T->_size = size;
//printf("%u %u/n",(tsize - size), s);
if ((tsize - size) > s) {
//printf("%u %u %u %u/n", tsize, size, s, tsize-s-size);
PLACEHOLDER *node = (PLACEHOLDER *)((char *)T + s + size);
node->_state = '/0';
node->_size = tsize - s - size;
node->_next = NULL;
node->_next = T->_next;
T->_next = node;
//printf("%u/n", node->_size);
}
return (void *)((char *)T + s);
}
}
T = T->_next;
}
return NULL;
}
void mini_free(void *tmp)
{
PLACEHOLDER *T = L;
PLACEHOLDER *prev = NULL;
while (T) {
if (tmp == (void *)(char *)T + s) {
if (T->_state != '/0')
T->_state = '/0';
if (T->_next != NULL && T->_next->_state == '/0') {
T->_size = T->_size + T->_next->_size + s;
T->_next = T->_next->_next;
}
if (prev != NULL && prev->_state == '/0') {
prev->_size = prev->_size + T->_size + s;
prev->_next = T->_next->_next;
}
break;
}
prev = T;
T = T->_next;
}
return;
}
//mini_malloc.h头文件
#include <stdio.h>
#include <stdlib.h>
#define MAXMEM 10000
typedef unsigned int size_t;
typedef struct PLACEHOLDER {
char _state;
size_t _size;
struct PLACEHOLDER *_next;
} PLACEHOLDER;
extern PLACEHOLDER *L;
extern void *P;
void *mini_malloc(size_t size);
void mini_free(void *p);
//mainApp.c主函数,主要用于测试mini_malloc和mini_free
#include "mini_malloc.h"
#define ARRAYSIZE 10
int main(int argc, char ** argv)
{
void * malloc_array[10] = {0};
int i = 1;
int j = 1;
int count = 100;
while(count-- > 0)
{
j = 1;
for(i = 1;i < ARRAYSIZE;i++)
{
if(malloc_array = mini_malloc((size_t)j))
printf("malloc 2^%d succeed!/n", i-1);
else
printf("malloc 2^%d failed!/n", i-1);
j *= 2;
}
i--;
for(;i > 0;i--)
if(malloc_array)
mini_free(malloc_array);
}
return 0;
}
//mini_malloc.c内存分配实现
#include "mini_malloc.h"
extern void *P = NULL;
extern PLACEHOLDER *L = NULL;
size_t s = 0;
void init_malloc()
{
if (P != NULL) return;
P = (void *)malloc(MAXMEM);
s = sizeof(PLACEHOLDER);
L = (PLACEHOLDER *)P;
L->_state = '/0';
L->_size = MAXMEM - s;
L->_next = NULL;
}
void *mini_malloc(size_t size)
{
init_malloc();
PLACEHOLDER *T = L;
size_t tsize = 0;
while (T) {
if (T->_state == '/0') {
//printf("%c %u %u/n", T->_state, T->_size, size);
if (size < T->_size) {
T->_state = 1;
tsize = T->_size;
T->_size = size;
//printf("%u %u/n",(tsize - size), s);
if ((tsize - size) > s) {
//printf("%u %u %u %u/n", tsize, size, s, tsize-s-size);
PLACEHOLDER *node = (PLACEHOLDER *)((char *)T + s + size);
node->_state = '/0';
node->_size = tsize - s - size;
node->_next = NULL;
node->_next = T->_next;
T->_next = node;
//printf("%u/n", node->_size);
}
return (void *)((char *)T + s);
}
}
T = T->_next;
}
return NULL;
}
void mini_free(void *tmp)
{
PLACEHOLDER *T = L;
PLACEHOLDER *prev = NULL;
while (T) {
if (tmp == (void *)(char *)T + s) {
if (T->_state != '/0')
T->_state = '/0';
if (T->_next != NULL && T->_next->_state == '/0') {
T->_size = T->_size + T->_next->_size + s;
T->_next = T->_next->_next;
}
if (prev != NULL && prev->_state == '/0') {
prev->_size = prev->_size + T->_size + s;
prev->_next = T->_next->_next;
}
break;
}
prev = T;
T = T->_next;
}
return;
}