sbrk 때문에 소스코드 실행이 안되요 ㅠ.ㅠ
방금 the c programming language 라는 책에서
malloc() 이거 함수 구현하는것을 열심히 타이핑 했습니다. 그런데 sbrk()이함수는 UNIX 함수 호출이라고 나오네요.. windowsxp에서 sbrk()이런 역할을 하는 함수를 가르쳐 주세요..
#include<stdio.h>
#include<string.h>
#define NALLOC 1024
typedef long Align;
union header
{
struct {
union header *ptr;
unsigned size;
}s;
Align x;
};
typedef union header Header;
static Header base;
static Header *freep = NULL;
void free(void *ap)
{
Header *bp, *p;
bp = (Header*)ap -1;
for ( p = freep ; !(bp>p &&bp < p->s.ptr); p = p->s.ptr)
if ( p >= p->s.ptr && (bp >p ||bp <p->s.ptr))
break;
if ( bp + bp->s.size == p->s.ptr)
{
bp ->s.size +=p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
}else
bp->s.ptr= p->s.ptr;
if ( p+ p->s.size == bp)
{
p->s.size +=bp->s.size;
p ->s.ptr = bp ->s.ptr;
}
else
p->s.ptr = bp;
freep = p;
}
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)
return NULL;
up = (Header *) cp;
up ->s.size = nu;
free ((void*)(up+1));
return freep;
}
void *mymalloc (unsigned nbytes)
{
Header *p, *prevp;
Header *morecore(unsigned);
unsigned nunits;
nunits = (nbytes +sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp = freep)==NULL)
{
base.s.ptr = freep = prevp = &
base.s.size = 0;
}
for ( p = prevp ->s.ptr; ; prevp = 0, p = p->s.ptr)
{
if ( p ->s.size >= nunits)
{
if ( p->s.size == nunits)
prevp ->s.ptr= p->s.ptr;
else{
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits;
}
freep = prevp;
return (void*)(p+1);
}
if ( p == freep)
if ((p = morecore(nunits)) ==NULL)
return NULL;
}
}
void main()
{
char * p ;
p = (char *)mymalloc (30);
strcpy(p, "hello world");
printf("%s", p);
}
...
기본적으로는 없을겁니다.
UWIN(맞나염?)이나 cygwin등과 같은 posix호환 레이어를 제공하는 환경에서라면 있을지도 모르지만...
sbrk을 LocalAlloc등의 Win32 API로 작성해주어야 할겁니다.
그리고...
...가 맞나요? BBCode을 안쓰셔서;;; 깨져서요;;;코드가 맞는지 확인해주세요. 저도 한번 해보게요.
그럼~
----
The future is here. It's just not widely distributed yet.
- William Gibson
댓글 달기