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

时间:2013-04-16 12:05:11

标签: c

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

sbrk(0)以及sbrk(size)都返回相同的地址,我所期待的是sbrk(size)应该从sbrk(0)返回5字节的地址。

1 个答案:

答案 0 :(得分:9)

当您使用sbrk(0)时,您会获得当前“中断”地址。

当您使用sbrk(size)时,您会获得之前的“中断”地址,即更改前的地址。

因此,如果您使用零大小调用一次,然后调用具有正大小的调用,则两者都将返回相同的值。如果您使用正尺寸调用之后使用零尺寸再次调用它,则会返回地址。