【发布时间】:2015-07-06 12:52:38
【问题描述】:
程序:
#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 后只更改程序中断。在 初始状态,如果堆有足够的内存,则无需更改 程序中断。所以起初,堆的大小为零。对吗?
【问题讨论】:
-
一个好的答案取决于架构 - 请告诉我们您的操作系统和硬件。根据您的操作系统,您可能有某种跟踪工具 - 您可以在跟踪下运行您的程序。您可能会在启动过程中看到对 brk() 系列系统调用的调用。 malloc 在某些系统上使用堆分箱 - 这意味着它有自己的堆块,与 libc 分开。
-
您的
printf()-说明符错误。%x需要unsigned int类型的参数,而sbrk()返回void *。 -
您还需要定义何时测量“初始”尺寸。在调用
main()之前可以运行相当多的代码。 -
我正在使用“Linux ltsp63 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:19:45 UTC 2012 i686 i686 i386 GNU/Linux”