2

我试图了解它是如何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?

4

1 回答 1

12

sbrk(n)增加中断n并返回中断的值。

因此:

    printf("end of the break : %p\n", sbrk(0));

输出:end of the break : 0xaa6000

最初,中断是 0xaa6000,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,因此它不必向操作系统请求更多)。

于 2017-01-28T19:23:19.740 回答