我试图了解它是如何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));
}
Run Code Online (Sandbox Code Playgroud)
这输出:
Run Code Online (Sandbox Code Playgroud)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));
Run Code Online (Sandbox Code Playgroud)
输出: end of the break : 0xaa6000
最初,中断为0xaa6000,并且sbrk
调用不会更改它.
printf("end of the break : %p\n", sbrk(10));
Run Code Online (Sandbox Code Playgroud)
输出: 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));
Run Code Online (Sandbox Code Playgroud)
输出: new end of the break : 0xac700a
这次我们看到增量为0xa,与之前的sbrk(10)
呼叫完全匹配.显然这次printf
不需要分配动态内存(或者如果它确实malloc
能够在第一个空间内完成所有内容sbrk
,所以它不需要从操作系统请求更多内容).