malloc()和free()

一直很好奇,当使用malloc函数分配了空间之后

当使用free()函数释放内存的时候,free()函数只需要一个指针就可以了,那free()函数是怎样知道应该释放多大的空间的呢??

函数是这样的
#include <stdio.h>
int main(int argc,char* argv[])
{
    int i;
    char* p1;
    for(i=1;i<100;i++)
    {
        p1=(char*)malloc(i);
        printf("size = %d ,m_size1 = %d ,m_size2 = %d\n",i,(int)(*(char*)((int)p1-3)),(int)(*(char*)((int)p1-4)));
    }
    return 0;
}
执行结果如下所示:

size = 1 ,m_size1 = 0 ,m_size2 = 17
size = 2 ,m_size1 = 0 ,m_size2 = 17
size = 3 ,m_size1 = 0 ,m_size2 = 17
size = 4 ,m_size1 = 0 ,m_size2 = 17
size = 5 ,m_size1 = 0 ,m_size2 = 17
size = 6 ,m_size1 = 0 ,m_size2 = 17
size = 7 ,m_size1 = 0 ,m_size2 = 17
size = 8 ,m_size1 = 0 ,m_size2 = 17
size = 9 ,m_size1 = 0 ,m_size2 = 17
size = 10 ,m_size1 = 0 ,m_size2 = 17
size = 11 ,m_size1 = 0 ,m_size2 = 17
size = 12 ,m_size1 = 0 ,m_size2 = 17
size = 13 ,m_size1 = 0 ,m_size2 = 25
size = 14 ,m_size1 = 0 ,m_size2 = 25
size = 15 ,m_size1 = 0 ,m_size2 = 25
size = 16 ,m_size1 = 0 ,m_size2 = 25
size = 17 ,m_size1 = 0 ,m_size2 = 25
size = 18 ,m_size1 = 0 ,m_size2 = 25
size = 19 ,m_size1 = 0 ,m_size2 = 25
size = 20 ,m_size1 = 0 ,m_size2 = 25
size = 21 ,m_size1 = 0 ,m_size2 = 33
size = 22 ,m_size1 = 0 ,m_size2 = 33
size = 23 ,m_size1 = 0 ,m_size2 = 33
size = 24 ,m_size1 = 0 ,m_size2 = 33
size = 25 ,m_size1 = 0 ,m_size2 = 33
size = 26 ,m_size1 = 0 ,m_size2 = 33
size = 27 ,m_size1 = 0 ,m_size2 = 33
size = 28 ,m_size1 = 0 ,m_size2 = 33
size = 29 ,m_size1 = 0 ,m_size2 = 41
size = 30 ,m_size1 = 0 ,m_size2 = 41
size = 31 ,m_size1 = 0 ,m_size2 = 41
size = 32 ,m_size1 = 0 ,m_size2 = 41
size = 33 ,m_size1 = 0 ,m_size2 = 41
size = 34 ,m_size1 = 0 ,m_size2 = 41
size = 35 ,m_size1 = 0 ,m_size2 = 41
size = 36 ,m_size1 = 0 ,m_size2 = 41
size = 37 ,m_size1 = 0 ,m_size2 = 49
size = 38 ,m_size1 = 0 ,m_size2 = 49
size = 39 ,m_size1 = 0 ,m_size2 = 49
size = 40 ,m_size1 = 0 ,m_size2 = 49
size = 41 ,m_size1 = 0 ,m_size2 = 49
size = 42 ,m_size1 = 0 ,m_size2 = 49
size = 43 ,m_size1 = 0 ,m_size2 = 49
size = 44 ,m_size1 = 0 ,m_size2 = 49
size = 45 ,m_size1 = 0 ,m_size2 = 57
size = 46 ,m_size1 = 0 ,m_size2 = 57
size = 47 ,m_size1 = 0 ,m_size2 = 57
size = 48 ,m_size1 = 0 ,m_size2 = 57
size = 49 ,m_size1 = 0 ,m_size2 = 57
size = 50 ,m_size1 = 0 ,m_size2 = 57
size = 51 ,m_size1 = 0 ,m_size2 = 57
size = 52 ,m_size1 = 0 ,m_size2 = 57
size = 53 ,m_size1 = 0 ,m_size2 = 65
size = 54 ,m_size1 = 0 ,m_size2 = 65
size = 55 ,m_size1 = 0 ,m_size2 = 65
size = 56 ,m_size1 = 0 ,m_size2 = 65
size = 57 ,m_size1 = 0 ,m_size2 = 65
size = 58 ,m_size1 = 0 ,m_size2 = 65
size = 59 ,m_size1 = 0 ,m_size2 = 65
size = 60 ,m_size1 = 0 ,m_size2 = 65
size = 61 ,m_size1 = 0 ,m_size2 = 73
size = 62 ,m_size1 = 0 ,m_size2 = 73
size = 63 ,m_size1 = 0 ,m_size2 = 73
size = 64 ,m_size1 = 0 ,m_size2 = 73
size = 65 ,m_size1 = 0 ,m_size2 = 73
size = 66 ,m_size1 = 0 ,m_size2 = 73
size = 67 ,m_size1 = 0 ,m_size2 = 73
size = 68 ,m_size1 = 0 ,m_size2 = 73
size = 69 ,m_size1 = 0 ,m_size2 = 81
size = 70 ,m_size1 = 0 ,m_size2 = 81
size = 71 ,m_size1 = 0 ,m_size2 = 81
size = 72 ,m_size1 = 0 ,m_size2 = 81
size = 73 ,m_size1 = 0 ,m_size2 = 81
size = 74 ,m_size1 = 0 ,m_size2 = 81
size = 75 ,m_size1 = 0 ,m_size2 = 81
size = 76 ,m_size1 = 0 ,m_size2 = 81
size = 77 ,m_size1 = 0 ,m_size2 = 89
size = 78 ,m_size1 = 0 ,m_size2 = 89
size = 79 ,m_size1 = 0 ,m_size2 = 89
size = 80 ,m_size1 = 0 ,m_size2 = 89
size = 81 ,m_size1 = 0 ,m_size2 = 89
size = 82 ,m_size1 = 0 ,m_size2 = 89
size = 83 ,m_size1 = 0 ,m_size2 = 89
size = 84 ,m_size1 = 0 ,m_size2 = 89
size = 85 ,m_size1 = 0 ,m_size2 = 97
size = 86 ,m_size1 = 0 ,m_size2 = 97
size = 87 ,m_size1 = 0 ,m_size2 = 97
size = 88 ,m_size1 = 0 ,m_size2 = 97
size = 89 ,m_size1 = 0 ,m_size2 = 97
size = 90 ,m_size1 = 0 ,m_size2 = 97
size = 91 ,m_size1 = 0 ,m_size2 = 97
size = 92 ,m_size1 = 0 ,m_size2 = 97
size = 93 ,m_size1 = 0 ,m_size2 = 105
size = 94 ,m_size1 = 0 ,m_size2 = 105
size = 95 ,m_size1 = 0 ,m_size2 = 105
size = 96 ,m_size1 = 0 ,m_size2 = 105
size = 97 ,m_size1 = 0 ,m_size2 = 105
size = 98 ,m_size1 = 0 ,m_size2 = 105
size = 99 ,m_size1 = 0 ,m_size2 = 105

这里从申请1个字节开始一直到申请了99个字节,m_size1记录的是malloc()函数返回地址-3的地址的值,m_size2记录的是malloc()函数返回地址-4的地址的值

这说明在调用malloc()函数进行内存空间分配的时候,会在分配地址的前面添加一些控制类的信息,记录这释放的时候应该释放多大的空间,

并且malloc()函数也并不是申请多少就一定分配多少的,malloc()分配的空间的基本单位是8个字节。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值