動態分配内存malloc()的一些測試結果
C語言的動態分配内存,使用malloc()函數(在stdlib或malloc頭中),它在堆内存中申請一塊指定大小size(字節計數)的空間,可能有人以爲size是多少,就佔用了多少堆空間,下面就是關於這個問題的測試。malloc()函數是返回分配空間入口地址的,測試的原理如下:連續申請兩塊空間,看兩者的入口地址差是多少,即知實際佔用的内存是否等於所申請的尺寸。代碼如下:
程序代码:
#include <stdio.h> #include <stdlib.h> #include <conio.h> void Pause(const char* message = "\nPress any key to continue..."); int main(void) { // 這裏不作任何別的動作,緊鄰申請兩塊空間,理論上它們是連續的 char* p1 = (char*)malloc(1000); char* p2 = (char*)malloc(1000); // 查看兩塊空間的入口地址差,p2 - p1的結果,就是p1所佔用的堆空間 printf_s("p2 - p1 = %d\n", p2 - p1); Pause(); return EXIT_SUCCESS; } void Pause(const char* message) { printf_s(message); _getch(); }
運行結果如下:
這個結果,我們可得到如下結論:
1.malloc()申請實際所佔用的堆内存,可能是不等於申請尺寸的,如圖示,申請1000字節的内存,實際上分配了1024字節。這與幫助文檔中所描述的一致:
The malloc function allocates a memory block of at least size bytes. The block may be larger than size bytes because of the space that's required for alignment and maintenance information.
2.修改測試數據,把第一個malloc()的參數改爲10,結果爲9992(比申請的10大得多),并非負數,這表明我們根本不能假定兩塊空間的先後次序。事實上,到50才出現負值結果,這中間不管size是多少,都是9992。所以,我們不要自作聰明,以爲後申請的在後,或在前,甚至,我們連實際上佔用了多少都不能假定,因爲這極可能與平臺有關。平常見不少人,用malloc()申請一個int之類,以爲節省了多少空間,殊不知浪費了多少,這還不說你用遠指針間接訪問的低效了(那些用指針存取基本數據類型的尤其如此)。指針和動態分配内存不是那般用的。
[ 本帖最后由 TonyDeng 于 2015-2-14 10:44 编辑 ]