简单内存分配算法相关内存布局

nfcac 2008-12-18 10:31:39
近日读到一段内存分配算法,但对算法内数据结构的内存布局没有搞明白.
程序如下:
onst int SEG_LEN = 128-4;
struct Mem_seg
{
char mem [SEG_LEN];
Mem_seg * next;
};

struct Mem_list
{
Mem_list(Mem_seg *h, Mem_seg *e)
:head(h),end(e)
{
}
Mem_seg * head;
Mem_seg * end;
};

Mem_list mem_init(char * all_mem, int free_size)
{
int seg_num = free_size / SEG_LEN;
for(int i=0;i<seg_num;++i)
((Mem_seg *)&all_mem[i * SEG_LEN])->next=(Mem_seg *)&all_mem[(i+1)*SEG_LEN];
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * SEG_LEN]);
}
...
void test_list(Mem_list test_list)
{
std::ofstream outfile;
outfile.open("test.txt", std::ios::app);
Mem_seg * phead = test_list.head;
Mem_seg * pend = test_list.end;

for(int i=0; phead != pend;phead=phead->next,i++)
outfile<<"head"<<":"<<phead<<",\t"
<<i<<":"<<&(phead->mem)<<",\t"
<<i<<":"<<&(phead->next)<<",\t"
<<i<<":"<<phead->next<<",\t"
<< "sizeof" << ":" << sizeof(*phead) << ",\t";

outfile<<std::endl;
outfile.close();
}
int main()
{

long mem_len = 384;
//long mem_len = 1024*8;
char *all_mem= new char[mem_len];
Mem_list free_list=mem_init(all_mem,mem_len);
test_list(free_list);

结果如下
head:0x8b1120, 0:0x8b1120, 0:0x8b119c, 0:0x8b119c, sizeof:128,
head:0x8b119c, 1:0x8b119c, 1:0x8b1218, 1:0x8b1218, sizeof:128,
head:0x8b1218, 2:0x8b1218, 2:0x8b1294, 2:0x8b1294, sizeof:128,
我的问题是内存里到底如何布局的,一段char数组,是不是包含了next指针(按照结构内存对其,理论上应该char[124]紧邻一个指针),还是没有包含,如果包含了那0-124是char,124-128是指针吗,但是为什么指针的指和指针的地址一样呢,如果一样岂不是下一个struct开头是上一个struct的next指针。如果没有包含那指针放到哪里去了,而且为什么指针地址貌似还在数组中
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyisnail 2008-12-19
  • 打赏
  • 举报
回复
这里有问题,内存布局如下:
Mem_seg:
------------------
| char[124] |
|------------------|
| Mem_seg* next |但是初始化后该指针指向自己
|------------------|
Mem_list mem_init(char * all_mem, int free_size)
{
int seg_num = free_size / SEG_LEN;
for(int i=0;i <seg_num;++i)
((Mem_seg *)&all_mem[i * SEG_LEN])->next=(Mem_seg *)&all_mem[(i+1)*SEG_LEN];
~~~问题出在这里,SEG_LEN=124,而不是128所以初始化后每个Mem_seg的指针都指向了自己
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * SEG_LEN]);
}
应该如下修改,就比较正确了

const int SEG_LEN = 128;
struct Mem_seg
{
char mem [SEG_LEN-4];
Mem_seg * next;
};
nfcac 2008-12-19
  • 打赏
  • 举报
回复
多谢Chiyer,xiaoyisnail,确实错了,我也是狐疑了半天
星羽 2008-12-19
  • 打赏
  • 举报
回复
注意数据块的大小是int block_size = SEG_LEN + 4;

而不是SEG_LEN ,否则你的偏移就有错了
  • 打赏
  • 举报
回复
楼主,帮顶,你是不是发错地方了?
星羽 2008-12-19
  • 打赏
  • 举报
回复
init 函数改一下


Mem_list mem_init(char * all_mem, int free_size)
{
int block_size = SEG_LEN + 4;
int seg_num = free_size / block_size;
for(int i=0;i <seg_num;++i)
((Mem_seg *)&all_mem[i * block_size])->next=(Mem_seg *)&all_mem[(i+1)*block_size];
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * block_size]);
}


--------

结果

head:009B1208, 0:009B1208, 0:009B1284, 0:009B1288, sizeof:128, head:009B1288, 1:009B1288, 1:009B1304, 1:009B1308, sizeof:128, head:009B1308, 2:009B1308, 2:009B1384, 2:009B1388, sizeof:128,


33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧