首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sbrk(0)和sbrk(size)返回相同的地址

sbrk(0)和sbrk(size)返回相同的地址
EN

Stack Overflow用户
提问于 2013-04-16 20:05:11
回答 1查看 18.5K关注 0票数 4
代码语言:javascript
复制
#include<unistd.h>
#include<stdio.h>

void *my_malloc(size_t size){
 void *p;
 void *q;
 p = sbrk(0);
 /* If sbrk fails, we return NULL */
 q = sbrk(size);
 if(q == (void *)-1){
  return NULL;
 }
 printf("\n size : %d  p : 0x%x q : 0x%x \n",size,p,q);
 return p;
}
int main(){
 int *p;
 p = my_malloc(5);
 printf("\n p : 0x%x \n",p);
}

brk(2)将断点放在给定的地址地址,如果成功则返回0,否则返回-1。全局errno符号表示错误的性质。sbrk(2)按给定的增量移动中断(以字节为单位)。根据系统实现,它返回以前的或新的中断地址。失败时,它返回(void *)-1并设置errno。在某些系统上,sbrk接受负值(以便释放一些映射内存)。由于sbrk的规范没有固定其结果的含义,所以我们在移动断点时不会使用返回值。但是,我们可以使用sbrk的一个特例:当增量为nul (即sbrk(0))时,返回值是实际的中断地址(以前的和新的中断地址是相同的)。因此,sbrk用于检索堆的起始位置,这是中断的初始位置。所以使用sbrk作为主要工具来实现malloc。

sbrk(0)和sbrk(size)都返回相同的地址,我所期望的是sbrk(size)应该返回sbrk(0)前面5个字节的地址。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-16 20:10:32

当你使用sbrk(0)时,你会得到当前的“中断”地址。

当你使用sbrk(size)时,你会得到之前的“中断”地址,也就是更改前的地址。

因此,如果您调用一次大小为零的函数,然后调用一个大小为正的函数,那么这两个函数都将返回相同的值。如果在以正大小调用之后再次以零大小调用它,它将返回新的地址。

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

https://stackoverflow.com/questions/16036595

复制
相关文章

相似问题

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