zoukankan      html  css  js  c++  java
  • 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时填充的数清零。然后再写入新的数据。

  • 相关阅读:
    今日进度
    今日进度
    今日进度
    今日进度
    pandas连接MySQL和impala
    sql语句获取今天、昨天、近7天、本周、上周、本月、上月、半年数据
    Python报错 ValueError: arrays must all be same length
    Python 连接 impala
    Test
    Selective Search for Object Recognition
  • 原文地址:https://www.cnblogs.com/autum/p/malloc.html
Copyright © 2011-2022 走看看