程序:
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
char *s;
printf("sbrk(0) before malloc(4): %x\n", sbrk(0));
i1 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i1 = (int *) malloc(4)': %x\n", sbrk(0));
i2 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i2 = (int *) malloc(4)': %x\n", sbrk(0));
}
输出:
sbrk(0) before malloc(4): a027000
sbrk(0) after `i1 = (int *) malloc(4)': a048000
sbrk(0) after `i2 = (int *) malloc(4)': a048000
上述程序的堆内存的初始大小是多少 . 我认为,在程序的初始阶段,堆的起始和结束地址是相同的 . 有一次,我们调用malloc,它使用sbrk分配内存 .
上面的程序显示,首先sbrk(0)返回a027000作为程序中断 . 执行malloc语句后,程序中断更改为a048000 . 它表明,在调用malloc之前,堆没有足够的内存 . 因此,调用malloc后只更改程序中断 . 在初始状态下,如果堆具有足够的内存,则无需更改程序中断 . 所以首先,堆的大小为零 . 这样对吗?
2 回答
发生什么取决于你的O / S在调用_2560952之前的作用 .
在Mac OS X上,在调用
main()
函数之前会发生大量的内存分配 . 我目前有一个18个左右的列表被抑制'memory abuses',这些都是在系统提供的启动代码调用main()
之前发生的事情 .运行一个简单的程序,每行打印一个参数,但不给它任何参数,因此没有输出,从而产生valgrind的使用报告,如下所示:
该程序的代码?
大量的内存活动,但在我写的代码中都没有 . 泄漏是我在抑制文件中记录的数字之一 .
当安装glibc debuginfo时(例如在Fedora 22上:
dnf debuginfo-install glibc-2.21-5.fc22.x86_64
),可以打印出main_arena
和mp_
.使用空
int main(void)
调试程序:mp_.sbrk_base
是堆的基础 . 在我的Linux上调用main
时,堆不存在 . 致电malloc(1000)
mp_.sbrk_base
后0x602000
.main_arena.top
是堆顶部的空闲内存块 . 这是0x6023f0