我不理解下面显示的程序。
#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函数分配堆内存。是不是?
答案 0 :(得分:1)
当您调用malloc时,堆会自动增长。由于sbrk调用很昂贵,系统内存管理器会分配大块系统内存,然后为应用程序提供较小的部分。当堆增长超过128 k时,您只分配4个字节。尝试分配超过4个字节,比如1 MB,看看会发生什么。