malloc calloc realloc free的简单实现

本文探讨了程序在计算机内存中的分布,强调了解内存分配的重要性,特别是对于堆和栈的理解。作者分享了一个简单的malloc实现,并对其进行了注释,强调了底层代码的严谨性和一些巧妙的编程技巧,如结构体的虚拟成员、内存释放策略等。阅读这个实现让作者收获颇丰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面: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字段时实际上访问的是数据区的第一个字节
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值