【问题标题】:Understanding C malloc and sbrk()理解 C malloc 和 sbrk()
【发布时间】:2011-12-13 05:45:45
【问题描述】:

我试图了解 C 中 malloc 和 sbrk 之间的区别以及它们之间的关系。据我了解 malloc 和 sbrk 几乎是一回事,但我读到 malloc 在分配内存时使用 sbrk。这真的很令人困惑,有人可以向我解释一下吗?

例如在这个程序中 malloc 是否调用 sbrk?如果是这样,它是否在每次调用时都简单地调用 sbrk,所以对于这个例子来说是 10 次?

int main(int argc, char **argv) {
        int i;
        void *start_pos, *finish_pos;
        void *res[10];
        start_pos = sbrk(0);
        for (i = 0; i < 10; i++) {
                res[i] = malloc(10);
        }
        finish_pos = sbrk(0);
        return 0;
}

谢谢,

【问题讨论】:

标签: c pointers malloc


【解决方案1】:

sbrk 向操作系统请求更多内存。这是一个非常底层的函数,不是很灵活。

malloc 使用sbrk,但更灵活。通常,malloc 会向sbrk 询问大块内存,然后分配这些大块的碎片。所以大多数对malloc 的调用不会导致对sbrk 的调用。

【讨论】:

  • 它可能只调用一次,因为您分配了 10 个块,每个块 10 个字节。即使有 malloc 的开销,这也很小。操作系统只能以 4096 字节的倍数分配内存(在大多数系统上)。如果你想确定,就在调试器下运行,在 sbrk 上下断点。
  • 所以我按照你说的在 sbrk 设置了一个断点,它只调用了一次。但是,因为我有 2 个 sbrk 电话,所以这不是错的吗?一个开始,一个结束?
  • 所以我在 sbrk 设置了一个断点,它只断了一次。断点可以检查malloc里面的代码吗?以便它在 malloc 内的 sbrk 上中断
【解决方案2】:

malloc使用sbrk--用于改变数据段的系统调用 K&R C 有一个附录,其中介绍了使用 sbrk 系统调用实现 mallocfree

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2015-11-30
    • 2016-09-29
    • 2014-12-29
    • 2019-10-08
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多