初级会员

- 积分
- 112
- 金钱
- 112
- 注册时间
- 2017-3-20
- 在线时间
- 30 小时
|
5金钱
一直用mymalloc()也没有发现问题,今天发现我动态申请的数据总是被改变,查到最后发现是另一处动态申请的时候就一定会导致我前面申请的数据被改变
所以打印一下申请的内存地址和长度
第一个申请的数据首地址1745783648,长度84
第二个申请的数据首地址1745783680,长度4
第三个申请的数据首地址1745783616,长度4
按照从高到低的申请方法,地址范围依次是
1745783564--1745783648
1745783676--1745783680
1745783612--1745783616
第一快内存包括了第三块内存,附上mymalloc代码
u32 my_mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u32 nmemb; //需要的内存块数
u32 cmemb=0;//连续空内存块数
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先执行初始化
if(size==0)return 0XFFFFFFFF;//不需要分配
nmemb=size/memblksize[memx]; //获取需要分配的连续内存块数
if(size%memblksize[memx])nmemb++;
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加
else cmemb=0; //连续内存块清零
if(cmemb==nmemb) //找到了连续nmemb个空内存块
{
for(i=0;i<nmemb;i++) //标注内存块非空
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//返回偏移地址
}
}
return 0XFFFFFFFF;//未找到符合分配条件的内存块
}
我的设置是32个字节的长度分块,我考虑是不是我第一个数据里有4字节的空位导致分配出错?但是分配的时候已经在管理表里标记了这段内存已分配了,
百思不解,原子哥?
|
最佳答案
查看完整内容[请看2#楼]
申请长度至少32字节,你申请4字节,也是分配32字节给你的。mymalloc是很可靠的,经过很多验证了。
|