的C代碼:的malloc() - 是否使用BRK()或mmap()的
// program break mechanism
// TLPI exercise 7-1
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%x\n", sbrk(0));
free(bl);
printf("%x\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
當編譯如下代碼:
printf("%10p\n", sbrk(0));
我得到警告提示:
format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’
問題1:這是爲什麼?
而且在我malloc(1024 * 1024)
之後,程序中斷似乎沒有改變。
這裏是輸出:
9b12000
9b12000
9b12000
問題2:該方法是否在堆中分配內存時開始以備將來使用?或者編譯器改變分配的時間點?否則,爲什麼?
[更新]摘要:BRK()或mmap()的
審查TLPI和檢查手冊頁(從TLPI的作者的幫助),現在我明白瞭如何malloc()
決定使用brk()
後或mmap()
,如下:
mallopt()
可以設置參數來控制的malloc()
行爲,有一個名爲M_MMAP_THRESHOLD
參數,一般來說:
- 如果請求的內存小於它,將使用
brk()
; - 如果請求的內存大於或等於它,將使用
mmap()
;
參數的默認值是128kb
(我的系統上),但在我的測試程序中,我使用1MB,所以mmap()
選擇,當我改變請求的內存爲32KB,只見brk()
將被使用。
該書提到TLPI第147頁和第1035頁,但我沒有仔細閱讀該部分。
該參數的詳細信息可在手冊頁mallopt()
中找到。
'#include'? –
JS1
@ JS1是的,解決了這個問題,你可以給我一個解釋,我是linux編程的新手...... –
你需要'''sbrk()'的原型''在'unistd.h'中。如果沒有原型,編譯器會假定未知函數返回「int」。 – JS1