malloc() free()函数分析
2012-04-22 22:11 至上 阅读(315) 评论(0) 编辑 收藏 举报- #include <stdio.h>
- #include "xlmalloc.h"
- main()
- {
char *p, *q,*t;
- p = (char *)SysLmalloc(2);
- memset(p,1,2);
q = (char *)SysLmalloc(16);
- memset(q,2,16);
- t = (char *)SysLmalloc(24);
- memset(t,3,24);
- SysLfree(q);
- SysLfree(t);
- t = (char *)SysLmalloc(16);
- memset(t,4,16);
- printf("this is a test string\n");
- return 0;
- }
关于malloc
首先分配p,从00427f20-00437f27是头部,从00427f28开始是数据段,共占有16个字节,2个块。头部指针指向00427f20,为自身,size=2
然后分配q,00427f08-00427f0f是头部,从00427f10-00427f1f是数据段,共占有24个字节,3个块。头部指针指向00427f08,为自身,size=3
最后分配t,从00427ee8-00427eef是头部,从00427ef0-00427f07是数据段,共占有32个字节,4个块。头部指针指向00427ee8,为自身,size=4
关于free
释放q后,原来q的地方指针指向00427ee0,为Allocp空闲链表首指针,size=3,数据用debugpat数组中的数据填充。此时空闲链表首指针也指向00427f08,为刚释放的q的地址处,形成一个环。
这样说来Allocp首地址是不定的吧,这个堆好像不是固定大小的。
释放t的时候,两个连续的空闲区合为一个,使用一个头部,指针指向00427ee0,而Allocp指向00427ee8,相互指向,形成环。数据区用debugpat数组中的数据填充。
重新分配t,大小3个块,头部指针为00427f08,指向自身。同时First头部,size减小为4个,原来是7个块,就是从空闲去分配出3个块给t。
这是在t的数据区赋初值为4.其实有一个清零的过程,就是把free时填充的数清零。然后再写入新的数据。