C语言中free函数是如何确定要释放多少内存空间的(malloc的秘密)

转载:C语言中free函数是如何确定要释放多少内存空间的

转载原因:通俗易懂,逻辑清晰。

今天看书的时候看到free函数释放动态申请的内存时只需要把内存块的首地址传过去就行了,显然仅仅依靠首地址是无法确定要释放多少内存的,猜想应该在某处存放着这个内存块的大小,网上搜了搜发现在Linux里面glibc在分配内存的时候会在内存块的地址前面的4个字节出存放内存块的大小,就猜想Windows里面应该也是这样。写了一个小程序测试了下:

1

2

3

4

5

6

7

8

9

10

11

#include <stdio.h>

#include <STDLIB.H>

int main(void)

{

    int *p = (int *) malloc(10 * sizeof(int));

    *p = 1;

    free(p);

    return 0;

}

运行调试,先找到这个内存块的地址:

现在看一下内存:

由于申请了40个字节大小的内存块,转换成16进制就是0x00000028,在内存中就是28 00 00 00 ,看一下上图可以发现内存块首地址之前的16个字节处和猜想中的结果一样,接下来申请一个400字节大小的内存块,转换成16进制就是0x00000190,在内存中就是90 01 00 00,再看一下运行的结果:

依然和推测出的结果一样,可见Windows里面当我们使用free函数释放内存的时候,函数会把内存块的首地址加上16,从这个位置就可以找到内存块的大小。

猜你喜欢

转载自blog.csdn.net/don_chiang709/article/details/89155340