我正在尝试了解 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));
}
这个输出:
end of break : 0xaa6000 end of break : 0xac7000 new end of the break : 0xac700a
为什么前2个地址不一样 0xac7000 - 0xaa6000 = 21000 而不是 10?
最佳答案
sbrk(n)
将中断递增 n
并返回中断的旧值。
因此:
printf("end of the break : %p\n", sbrk(0));
输出:中断结束:0xaa6000
最初,中断是 0xaa6000,sbrk
调用不会改变它。
printf("end of the break : %p\n", sbrk(10));
输出:中断结束:0xac7000
这就是您要询问的值。上面我说过 sbrk(0)
不会改变中断,那么为什么我们在这里得到不同的值?
在两次 sbrk
调用之间唯一发生的事情是调用第一个 printf
。据推测,您的 stdio 实现的内部使用了 malloc
(例如创建缓冲区),后者又调用了 sbrk
本身。换句话说,printf
在内部调用 malloc
,它使用 sbrk
保留内存。
printf("new end of the break : %p\n\n", sbrk(0));
输出:新的中断结束:0xac700a
这次我们看到一个增量 0xa,它与您之前的 sbrk(10)
调用完全匹配。显然这一次 printf
不需要分配动态内存(或者如果需要,malloc
能够在它从第一个 sbrk 获得的空间内完成所有事情
,因此它不必向操作系统请求更多)。
关于c - sbrk() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41913553/