c语言内存对其和内存碎片问题
cpu使用stm32f107,编译用keil,网络应用,要求在网络不通的时候储存有效数据,到一定程度循环存放,释放最老的数据包……
当初考虑过使用数组解决,但是因为每包数据长度不固定,使用数组也不是一个很好的办法;而且储存的数据多的时候使用数组处理起来更麻烦;使用此种方法是否会造成内存碎片及内存耗尽的情况?
struct LNODE
{
u16 buflen; //包长度
u8 ref; //包标志,为1说明该包需要发送
struct LNODE *next; //下包地址
u8 *payload; //该包未发送数据指针
}
*not_sent_bufs;
//缓存链表首地址
链表节点如上,payload为不定长数据包指针,其长度为buflen,为了避免内存碎片,想创建节点时把payload数据内存一并申请,即malloc(sizeof(struct LNODE)+buflen);同时payload指向数据区头部;可否如此
not_sent_bufs = malloc(sizeof(struct LNODE)+buflen);
not_sent_bufs ->payload = (unsigned char *)not_sent_bufs +sizeof(struct LNODE); //
memcpy(not_sent_bufs ->payload,sbuf,buflen); //拷贝数据
……
加入节点到链表
……
当初考虑过使用数组解决,但是因为每包数据长度不固定,使用数组也不是一个很好的办法;而且储存的数据多的时候使用数组处理起来更麻烦;使用此种方法是否会造成内存碎片及内存耗尽的情况?
struct LNODE
{
u16 buflen; //包长度
u8 ref; //包标志,为1说明该包需要发送
struct LNODE *next; //下包地址
u8 *payload; //该包未发送数据指针
}
*not_sent_bufs;
//缓存链表首地址
链表节点如上,payload为不定长数据包指针,其长度为buflen,为了避免内存碎片,想创建节点时把payload数据内存一并申请,即malloc(sizeof(struct LNODE)+buflen);同时payload指向数据区头部;可否如此
not_sent_bufs = malloc(sizeof(struct LNODE)+buflen);
not_sent_bufs ->payload = (unsigned char *)not_sent_bufs +sizeof(struct LNODE); //
memcpy(not_sent_bufs ->payload,sbuf,buflen); //拷贝数据
……
加入节点到链表
……
...全文
相关推荐
操作系统 内存分配与回收 C语言模拟(含源代码和.exe文件)
操作系统内存分配与回收C语言模拟。包含源代码和.exe可执行文件
操作系统内存管理实验(C语言实现)
操作系统内存管理实验(C语言实现)
内存分配方式及内存碎片
因为所有的内存分配必须起始于可被 4、8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。
C语言实现malloc和free
用C自己实现malloc和free,需要的可以看下,没实际用处,不过可以了解C的原型原理
内存碎片处理技术
内存碎片处理技术的书籍


驱动开发/核心开发
