找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4123|回复: 1
打印 上一主题 下一主题
收起左侧

内存的malloc和free结构体

[复制链接]
跳转到指定楼层
楼主
ID:113276 发表于 2016-4-10 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内存的malloc和free结构体:
接上文,内存也需要像FAT32文件这样操作。动态分配这个空间。

那么,一个什么样的结构,可以满足内存的动态分配呢?

struct RAM{
int *Pbefore;
int *Pstart;
int lenth;
int *Pnext;
};
int  *Pstart:空白内存的首地址
int   lenth:空白内存的长度
int   *Pnext:下一个空白内存地址
int *Pbefore:上一个空白内存地址

动态分配RAM的过程:
1:顺着链表一个方向,寻找大于申请空间的RAM

2:找到之后,将Pstart = Pstart + lenth;//修改剩余空间的指针

3:将lenth =lenth - Req_lenth;       //剩余的空间

4:同时回朔上一个空白地址结构,将其Pnext = Pstart; //修改上一个RAM的Pnext指向地址

4:返回最早的地址。


这只是一个最简单的模型:在这个模型里面,我们只要一找到有空白空间,就进行分配

   其实,是不是可以再找找看,有没有更合适的空间,刚刚比需要的空间大一点点,这样,内存的使用是不是更有效果呢?!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:113276 发表于 2016-4-10 15:29 | 只看该作者
                                                                                                     malloc函数从FAT32文件扩展到内存       malloc的全称是memoryallocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
      malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void*表示未确定类型的指针。C/C++规定,void*类型可以强制转换为任何其它类型的指针。​
​内存空间是连续的。
001--002--003--004……00n
内存应该支持这样一个结构:链表,连接空闲内存空间​
​​
调用malloc函数:
1:根据内存块的空闲链表寻找一个大到足以满足用户请求所需要的内存块。(为什么是大于呢?哥哥,没有那么巧合的事,要100字节,就有一个100字节的空间等着你。可能是150字节的空间等着你)
2:将该内存块一分为二(一块的大小与用户请求的大小相等(100字节大小),另一块的大小就是剩下的字节(50字节))。
3:将100字节大小的内存地址传给用户,
4:并将剩下的50字节内存块(如果有的话)返回到空闲链表上。


调用free函数:
将用户释放的内存块连接到空闲链上。

     久而久之,空闲链会被切成很多的小内存片段(这边50字节,那边30个字节……),如果这时用户申请一个比较大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。
     那要怎么办呢?malloc函数请求延时,开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,表明分配内存空间失败。
因此在调用malloc动态申请内存块时,一定要进行返回值的判断。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表