#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的一个特殊情况:当增量为零时(即sbrk(0)),返回的值是实际的断点地址(先前和新的断点地址相同)。因此,sbrk用于检索堆的开始位置,这是断点的初始位置。
因此,使用sbrk作为实现malloc的主要工具。
sbrk(0)以及sbrk(size)都返回相同的地址,我期望的是sbrk(size)应该返回比sbrk(0)多5个字节的地址。