如何实现malloc函数

zf_fcxp 2003-09-21 05:49:30
在标准c中malloc函数是如何实现的
不同系统中有什么不同如linux/windows/dos
能给了源代码吗?谢谢

...全文
413 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alexander 2003-09-25
  • 打赏
  • 举报
回复
interrupt(0x21);
就行了吧~~~
laomai 2003-09-24
  • 打赏
  • 举报
回复
to 完美废人
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!
program2100 2003-09-23
  • 打赏
  • 举报
回复
pf pf,学习
skywater 2003-09-23
  • 打赏
  • 举报
回复
学习之。
Wolf0403 2003-09-23
  • 打赏
  • 举报
回复
UNIX 系统调用 sbrk (n) 返回的指针指向的空间包含 n 个额外的字节。如果没有空间,那么 sbrk 返回 -1。 ... -1 必须强制转换成 char 类型,以便与返回值相比较。
——摘自 The C Programming Language 中文版,P160,呵呵

也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。
laomai 2003-09-22
  • 打赏
  • 举报
回复
morecore的代码:
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
static Header* morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu = NALLOC;
}
cp =sbrk(nu *sizeof(Header));
if(cp == (char*)-1) /*no space at all*/
{
return NULL:
}
up = (Header*) cp;
up->s.size = nu;
free(void *)(up+1));
return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"
laomai 2003-09-22
  • 打赏
  • 举报
回复
static Header base; /* empty list to get started*/
static Header *freep = NULL; /*start of free list*/
/* malloc :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
Header *p,*prevp;
Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
代码见下一贴*/
unsigned nunits; /*内存单元的个数*/
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp=freep) == NULL) /*no free list*/
{
base.s.ptr = freep = prevp = &base;
base.s.size = 0;
}
for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr) /*注意循环条件为空*/
{
if(p->s.size >= nunits) /* big enough*/
{
if(p->s.size == nunits) /*exactly equal*/
{
prevp->s.ptr = p->s.ptr;
}
else
{
p->s.size -= nunits;
p += p->s.size;
p->s.size = units;
}
freep = prevp;
rerturn (void*)(p+1);
} /*end of first if*/
if(p == freep) /*wrapped around free list*/
{
if((p==morecoe(units)) == NULL)
return NULL; /*none left*/
}
}/*end of for*/
}/*end of malloc*/
laomai 2003-09-22
  • 打赏
  • 举报
回复
我刚看完英文版的《the c programming language》(花了两个月,呵呵),现学现卖。
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align /*for allignment to long boundary*/
union header /* block header */
{
struct
{
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
}
Align x; /* force alignment of blocks*/
};
typedef union header Header;
Caoyu015 2003-09-21
  • 打赏
  • 举报
回复
ODS中是调用int 21H 的内存分配功能号来分配的.
Wolf0403 2003-09-21
  • 打赏
  • 举报
回复
在 VC 中单步调试跟踪就清楚了。我只知道 Win32 是用的
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理

24,853

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧