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로 작성해주어야 할겁니다.
그리고...
#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 myfree(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; myfree ((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); myfree((void*)p); }...가 맞나요? BBCode을 안쓰셔서;;; 깨져서요;;;코드가 맞는지 확인해주세요. 저도 한번 해보게요.
그럼~
----
The future is here. It's just not widely distributed yet.
- William Gibson
댓글 달기