此代碼來自K & R書 - 第8章第7節:示例 - 存儲分配器。這段代碼至少對我來說沒有意義。 「Header」是一個結構體和一個「限制性最強的對齊類型」的聯合,這是一種長類型。然後,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 */
}
}
這段代碼的奇數部分是語句nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
,然後在比較if (p->s.size >= nunits)
用於查找單位一個足夠大的空間,在頭部的大小方面。前者不應該只是nunits = (nbytes+sizeof(Header))/sizeof(Header)
?原始代碼將評估爲比它應該低的值。什麼是+ -1s?爲什麼分配空間比想要的少。
保持運營商的優先考慮,並再次分析... –
@duffymo:而不是告訴我,你不能告訴我代碼如何工作?順便說一句,你讀過那本書嗎?注意到很多錯別字?但沒有人對此說過任何話。 – 1der
假設這是第一次調用'malloc',並且您已經請求了1個字節,即'malloc(1)',並且看到了哪些'nunits'返回了您的建議修正和書中的代碼。 – dirkgently