本文鏈接: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,從這個位置就可以找到內存塊的大小。