カーニハンとリッチー(第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;
これは本当に明白な回答かもしれません。
何が起こるかは未定義です。実際には、プログラムが期待どおりに動作することを意味するかもしれませんが、期待どおり動作しますが遅くなるか、アラインメントエラーでクラッシュします。 –