今日课堂上用链表写的malloc

//在远程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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值