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

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

4

1 回答 1

14

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

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

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

于 2013-04-16T12:10:32.393 回答