2017-02-09 4 views
2

カーニハンとリッチー(第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これはSingual Unix仕様に準拠していないため、バグではありません。これは、Cライブラリの実装で使用される可能性のあるコードの例であり、 'malloc'と' free'という名前の関数を定義しているため、C標準にも準拠していません。 –