我正在努力理解sbrk是如何工作的。
这是我的小密码:
int main()
{
printf("end of the break : %p\n", sbrk(0));
printf("end of the break : %p\n", sbrk(10));
printf("new end of the break : %p\n\n", sbrk(0));
}这一产出如下:
中断结束:0xa6000结束中断:0xac 7000新结束的中断: 0xac700a
为什么前两个地址0xac7000 -0xa6000= 21000而不是10?
发布于 2017-01-28 19:23:19
sbrk(n)通过n递增中断,并返回中断的旧值。
因此:
printf("end of the break : %p\n", sbrk(0));输出:end of the break : 0xaa6000
最初,中断是0xa6000,sbrk调用不会改变它。
printf("end of the break : %p\n", sbrk(10));输出:end of the break : 0xac7000
这就是你要问的价值。上面我说过sbrk(0)不会改变休息时间,那么为什么我们在这里得到不同的值呢?
在两个sbrk调用之间发生的唯一一件事是对第一个printf的调用。您的stdio实现的内部可能使用malloc (例如创建缓冲区),这反过来又调用了sbrk本身。换句话说,printf在内部调用malloc,它使用sbrk保留内存。
printf("new end of the break : %p\n\n", sbrk(0));输出:new end of the break : 0xac700a
这一次,我们看到了0xa的增量,它与您以前的sbrk(10)调用完全匹配。显然,这次printf不需要分配动态内存(或者如果它分配了动态内存,malloc就可以在它从第一个sbrk获得的空间内完成所有事情,所以它不必向操作系统请求更多)。
https://stackoverflow.com/questions/41913553
复制相似问题