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

标签 c unix sbrk brk

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

相关文章:

c - 为什么第一个 sbrk 的返回值与后续调用不同?

c - 我如何打印序列的范围(除了c中带有while循环的序列)

c++ - 结构中的指针

c - 如何找到在命令行输入的双数的平均值?

linux - 如何使用 shell 脚本将目录中列出的所有文件分配给文件列表?

php - PHP 中的 UNIX 包装器

linux - 符号链接(symbolic link)中的环境变量

assembly - 如何释放MIPS中的堆内存

c - TDM-GCC - 在 Kernighan & Ritchie 的存储分配器实现程序中未定义对 sbrk() 的引用

c - libxml2 和 XPath 在 ANSI C 中遍历 child 和 sibling