写在前面:csdn的博客排版就是shit,祝早日关门大吉
内存分配其实是个必修课,应该清楚地知道一个程序在计算机中的内存分布情况,linux程序在内存中的分布情况是这样的:
当然啦除了知道诸如“堆从低地址向高地址增长栈从高地址从低地址增长”这种东西之外最好还要知道“什么是分页为什么分页malloc的内部实现用到了brk()sbrk()MMU是什么”之类的这种东西。
切入正题,一个简单的malloc实现如下:
#include <stdio.h>
#include "unistd.h"
#define BLOCK_SIZE 40
typedef struct s_block *t_block;
void *first_block=NULL;
t_block find_block(t_block *last,size_t size);
t_block extend_heap(t_block last, size_t s);
void split_block(t_block b,size_t s);
size_t align8(size_t s);
void *malloc(size_t size);
void *calloc(size_t number, size_t size);
t_block get_block(void *p);
int valid_addr(void *p);
t_block fusion(t_block b);
void free(void *p);
void copy_block(t_block src,t_block dst);
void *realloc(void *p,size_t size);
struct s_block{
size_t size;//数据区大小
t_block prev;//指向上个块的指针
t_block next;//指向下个块的指针
int free;//判断是否是空闲块
int padding;//填充4字节,为了迎合结构体对齐,保证meta块长度为8的倍数
void *ptr;//Magic pointer,指向data
//虚拟字段这个是真的巧妙!每个块的s_block后面都是数据区,但是这个data[]不算作s_block的内容
//不计作s_block的长度,所以在访问s_block的data字段时实际上访问的是数据区的第一个字节