首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sbrk()是如何工作的?

sbrk()是如何工作的?
EN

Stack Overflow用户
提问于 2017-01-28 18:53:17
回答 1查看 4.2K关注 0票数 3

我正在努力理解sbrk是如何工作的。

这是我的小密码:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2017-01-28 19:23:19

sbrk(n)通过n递增中断,并返回中断的旧值。

因此:

代码语言:javascript
复制
    printf("end of the break : %p\n", sbrk(0));

输出:end of the break : 0xaa6000

最初,中断是0xa6000,sbrk调用不会改变它。

代码语言:javascript
复制
    printf("end of the break : %p\n", sbrk(10));

输出:end of the break : 0xac7000

这就是你要问的价值。上面我说过sbrk(0)不会改变休息时间,那么为什么我们在这里得到不同的值呢?

在两个sbrk调用之间发生的唯一一件事是对第一个printf的调用。您的stdio实现的内部可能使用malloc (例如创建缓冲区),这反过来又调用了sbrk本身。换句话说,printf在内部调用malloc,它使用sbrk保留内存。

代码语言:javascript
复制
    printf("new end of the break : %p\n\n", sbrk(0));

输出:new end of the break : 0xac700a

这一次,我们看到了0xa的增量,它与您以前的sbrk(10)调用完全匹配。显然,这次printf不需要分配动态内存(或者如果它分配了动态内存,malloc就可以在它从第一个sbrk获得的空间内完成所有事情,所以它不必向操作系统请求更多)。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41913553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档