本文鏈接:http://www.cnblogs.com/xxNote/p/4009359.html
今天看書的時候看到free函數釋放動態申請的內存時只需要把內存塊的首地址傳過去就行了,顯然僅僅依靠首地址是無法確定要釋放多少內存的,猜想應該在某處存放着這個內存塊的大小,網上搜了搜發現在Linux里面glibc在分配內存的時候會在內存塊的地址前面的4個字節出存放內存塊的大小,就猜想Windows里面應該也是這樣。寫了一個小程序測試了下:
#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,從這個位置就可以找到內存塊的大小。
