首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sbrk与负参数

Sbrk与负参数
EN

Stack Overflow用户
提问于 2014-03-26 16:04:00
回答 5查看 3.1K关注 0票数 1

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

代码语言:javascript
复制
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的免费实现。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-26 18:40:19

MacOSX小牛和sbrk()的行为(几乎)与Linux上的行为(几乎)相同,但有两个例外:

  • 我收到一个编译器警告:tst21.c:12:6: warning: 'sbrk' is deprecated [-Wdeprecated-declarations]
  • 使用负值将内存还给操作系统似乎是不可能的(据我所知,这是几十年前在SYSV4上观察到的相同行为:释放sbrk()分配的内存是不可能的)
票数 2
EN

Stack Overflow用户

发布于 2014-03-26 16:06:38

这可能是因为您使用的大小太小,因此在sbrk()中会出现某种形式的舍入。对于这样的事情,我从来没有期望过字节级的精确性,它更有可能在页面单位中工作(在典型的Linux系统中大约是4KB)。

另外,请注意手册上写着:

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

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

票数 2
EN

Stack Overflow用户

发布于 2022-10-07 15:33:55

代码语言:javascript
复制
int main(int argc, char **argv) {
  void *a = sbrk(0);
  printf("%p\n", a);

  a = sbrk(2);
  printf("%p\n", a);

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

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

输出:

代码语言:javascript
复制
0x560267a31000
0x560267a52000
0x560267a52002
0x560267a52001

根据手册void *sbrk(intptr_t increment)返回旧值brk时,成功。sbrk(0)返回电流brk

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22666728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档