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

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

#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
    int *i1, *i2;
    char *s;
    printf("sbrk(0) before malloc(4): 0x%xn", sbrk(0));
    i1 = (int *) malloc(4);
    printf("sbrk(0) after `i1 = (int *) malloc(4)': 0x%xn", sbrk(0));
    i2 = (int *) malloc(4);
    printf("sbrk(0) after `i2 = (int *) malloc(4)': 0x%xn", sbrk(0));
    printf("i1 = %p, i2 = %pn", 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,然后看看会发生什么。

链接地址: http://www.djcxy.com/p/2477.html

上一篇: How malloc allocates memory and what is the size of Heap?

下一篇: Why shouldn't I use PyPy over CPython if PyPy is 6.3 times faster?