malloc() free()函数分析

  1. #include <stdio.h>
  2. #include "xlmalloc.h"
  3. main()
  4. {
  5.        char *p, *q,*t;
  6.        p = (char *)SysLmalloc(2);
  7.        memset(p,1,2);
  8.        q = (char *)SysLmalloc(16);
  9.        memset(q,2,16);
  10.        t = (char *)SysLmalloc(24);
  11.        memset(t,3,24);
  12.        SysLfree(q);
  13.        SysLfree(t);
  14.        t = (char *)SysLmalloc(16);
  15.        memset(t,4,16);
  16.        printf("this is a test string\n");
  17.        return 0;
  18. }

关于malloc


首先分配p,从00427f20-00437f27是头部,从00427f28开始是数据段,共占有16个字节,2个块。头部指针指向00427f20,为自身,size=2

然后分配q00427f08-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时填充的数清零。然后再写入新的数据。

原文地址:https://www.cnblogs.com/autum/p/malloc.html