簡體   English   中英

malloc如何分配內存以及Heap的大小是多少?

[英]How malloc allocates memory and what is the size of Heap?

我不明白下面顯示的程序。

#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
    int *i1, *i2;
    char *s;
    printf("sbrk(0) before malloc(4): 0x%x\n", sbrk(0));
    i1 = (int *) malloc(4);
    printf("sbrk(0) after `i1 = (int *) malloc(4)': 0x%x\n", sbrk(0));
    i2 = (int *) malloc(4);
    printf("sbrk(0) after `i2 = (int *) malloc(4)': 0x%x\n", sbrk(0));
    printf("i1 = %p, i2 = %p\n", i1, i2);
} 

Output:
mohanraj@ltsp63:~/Development/chap8$ ./a.out
sbrk(0) before malloc(4): 0x8999000
sbrk(0) after `i1 = (int *) malloc(4)': 0x89ba000
sbrk(0) after `i2 = (int *) malloc(4)': 0x89ba000
i1 = 0x8999008, i2 = 0x8999018
mohanraj@ltsp63:~/Development/chap8$

上面的輸出顯示,第一次,程序中斷是0x8999000。 一旦調用了malloc,程序中斷就變成了0x89ba000。

我不清楚的是:

malloc有什么用。 根據參考,malloc 用於在堆中分配內存。 在程序執行的初始階段,堆內存的大小是多少? 那個時候堆有沒有內存。 從輸出來看,如果堆已經有內存,那么為什么要更改程序中斷。 malloc 會自動在堆中分配請求的內存大小。

從上面的輸出來看,一旦調用了 malloc,程序中斷就改變了。 第二次調用malloc后,程序中斷沒有改變。 所以,它表明在程序執行的初始階段,堆不包含內存。 一旦 malloc 被調用,則只使用 sbrk 函數分配堆內存。 這樣對嗎?

當您調用 malloc 時,堆會自動增長。 由於 sbrk 調用的開銷很大,系統內存管理器會分配大塊的系統內存,然后將較小的塊分配給應用程序。 當堆增長超過 128 k 時,您只分配了 4 個字節。 嘗試分配多於 4 個字節,比如 1 MB,看看會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM