Sbrk和负参数

时间:2014-03-26 16:04:01

标签: c malloc sbrk

当我使用sbrk释放内存时,我遇到了问题。我传递sbrk一个负值,但它不会减少堆的开始。这是代码

int main(int argc, char** argv) {
    void * a = sbrk(0);
    printf("%p\n",a);

    sbrk(2);
    sbrk(-1);
    a = sbrk(0);
    printf("%p\n",a);
}

以下是示例输出:

0x10734f000

0x10734f002

我不明白为什么在sbrk减1之后打印值不会以0x10734f001的形式返回。

我不允许在此程序中使用malloc。这是针对malloc的自定义实现和使用sbrk

的免费实现

4 个答案:

答案 0 :(得分:2)

可能是您使用的尺寸太小,因此在sbrk()内会发生某种形式的舍入。我永远不会期望像这样的字节级精度,它更可能以页面为单位工作(在典型的Linux系统上是4 KB或左右)。

另外,请注意手册中说明:

  

避免使用brk()和sbrk():malloc(3)内存分配包是分配内存的便携且舒适的方式。

malloc()可能知道sbrk()有任何限制并处理它们,它是首选的应用程序级接口。

答案 1 :(得分:1)

刚刚使用MacOSX Mavericks进行测试,sbrk()的行为(几乎)与Linux相同,但有两个例外:

  • 我收到编译器警告: tst21.c:12:6: warning: 'sbrk' is deprecated [-Wdeprecated-declarations]
  • 似乎没有可能使用负值将内存返回给操作系统(这是 - 据我记忆 - 几十年前在SYSV4上观察到的相同行为:释放由{{1分配的内存“不可能”

答案 2 :(得分:-1)

printf使用malloc从而增加了数据段的大小

答案 3 :(得分:-1)

在不使用 printf 的情况下尝试一下,并使用调试器打印出您的结果。它将正常工作,结果将如预期的那样。堆将按预期增加 2 并减少 -1。