gpt4 book ai didi

c - sbrk() 是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:52 25 4
gpt4 key购买 nike

我正在尝试了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com