当我使用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
的免费实现答案 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]
答案 2 :(得分:-1)
printf使用malloc从而增加了数据段的大小
答案 3 :(得分:-1)
在不使用 printf 的情况下尝试一下,并使用调试器打印出您的结果。它将正常工作,结果将如预期的那样。堆将按预期增加 2 并减少 -1。