堆
地址小小 0x930000
...
地址小 0x9483000
addr1
addr2
addr3
...
addrn
地址大 0x9483020
main()
{
第一次变更,扩大0字节:
int *p1 = sbrk(0);
//返回值是本次扩大前堆的界限addr。 这里实验结果 p1 = 0x9483000。
//本次扩大堆0字节后,堆界限不变等于p1的值(实验看堆界限随着扩展扩大向大地址变)。
第二次变更,扩大4字节:
int *p2 = sbrk(4);
//扩大堆4字节,实验结果p2 = 0x9483000。 返回值是上次变更堆大小后堆界限地址。
//本次扩大4字节后,堆界限增加4,即0x9483004。
第三次变更,扩大4字节:
int *p3 = sbrk(4);
//继续扩大4B,实验结果p3 = 0x9483004。
//本次扩大4字节后,堆界限增加4,即0x9483008。
第四步,回收内存,缩小8字节:
sbrk(-8);
//之后堆界限(大地址)恢复到程序第一步sbrk(0)之前,即0x9483000
//返回值定义:返回上次,即第四步变更后堆的界限(大地址),即上一行的0x9483000
int *p4 = sbrk(0);
//本次变更0字节,堆界限不变
}
诸位觉得对此篇文章哪些地方有疑惑,欢迎提出,促进我改正完善。谢谢~