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

标签 c++ c linux unix memory-management

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

#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,然后看看会发生什么。

关于c++ - malloc如何分配内存以及Heap的大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217963/

上一篇:调用方法C

下一篇:c - fread() 未成功返回

相关文章:

linux - Bash : Adding thread-capability to this bash function, 所以它更快

sql - tup SQL 重置错误 : database is locked

c - C 中的运算符优先级

linux - 将 IFS 设置为在换行符上拆分时,为什么需要包含退格键?

c++ - C++ 中的全卷积网络训练

android - C++识别运行平台(Android、iOS等)

c++ - 分离圆环中的三角带

c++ - 奇怪的堆损坏错误

c - 如何将 typedef union 翻译成 delphi?

c - 不使用 libc 获取输入