2017-02-09 39 views
2

引用從Kernighan和Ritchie代碼(第2版第188頁),對齊問題分配SBRK的指針的結果時 - K&R

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返回的值會發生什麼就像101一樣,當指針分配到up完成後,對齊將無效up = (Header*)cp;

這可能有一個非常明顯的答案,所以很抱歉,如果我錯過了!

+0

發生了什麼是未定義的。在實踐中,這可能意味着該程序按預期工作,它按預期工作但速度較慢,或者因對齊錯誤而崩潰。 –

回答

2

根據this page,其中authoritiveness我不能說:

它是未指定是否由SBRK返回的指針()被適當地用於任何目的對準。

所以基本上,是的,你可能很好地發現有對齊問題。

+0

因此,K&R中的代碼中存在一個錯誤? – Curious

+0

我不會在那裏不同意! –

+0

@Curious它不是一個真正的bug,因爲它不應該符合Singing Unix Specification。這是一個可能用於實現C庫的代碼示例,因此它也不符合C標準,因爲它定義了名爲'malloc'和'free'的函數。 –