이 코드는 K & R 서적 - 8 장 섹션 7 : 예 - 저장 장치 할당 자입니다. 최소한이 코드는 의미가 없습니다. "머리글"은 구조체와 긴 형식 인 "가장 제한적인 정렬 유형"의 합집합입니다. Malloc은 헤더 크기의 배수 크기의 충분한 여유 공간을 찾습니다.K & R malloc 코드가 맞지 않습니까?
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 yet */
base.s.ptr = freeptr = prevptr = &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 */
prevp->s.ptr = p->s.ptr;
else { /* allocate tail end */
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits;
}
freep = prevp;
return (void *)(p+1);
}
if (p == freep) /* wrapped around free list */
if ((p = morecore(nunits)) == NULL)
return NULL; /* none left */
}
}
이 코드의 이상한 부분은 헤더의 크기면에서 단위 충분히 큰 공간을 찾기 위해 비교 if (p->s.size >= nunits)
에서 사용되는 문 nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
입니다. 전자가 nunits = (nbytes+sizeof(Header))/sizeof(Header)
일까요? 원래의 코드는해야 할 것보다 적은 값으로 평가됩니다. + -1은 무엇입니까? 왜 원하는 것보다 적은 공간을 할당해야 하는가?
운영자의 우선 순위를 염두에두고 다시 분석하십시오. –
@duffymo : 그게 아니라 코드가 어떻게 작동하는지 말해 줄 수 있습니까? 그건 그렇고, 그 책 읽었 니? 많은 오타가 있음을 알았습니까? 그러나 아무도 그런 말을하지 않았습니다. – 1der
이것이 malloc에 대한 첫 번째 호출이라고 가정하고 1 바이트 즉,'malloc (1)'을 요청하고 제안 된 수정과 코드에서'nunits'가 반환하는 것을 본다. – dirkgently