コード:
typedef long Align;
union header {
struct {
union header *ptr;
unsigned size;
} s;
Align x;
};
typedef union header Header;
................
................
................
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)
return NULL;
up = (Header *) cp;
up->s.size = nu;
free((void *)(up+1));
return freep;
}
疑問に思う:
morecore 関数が他の関数から呼び出されていると見なし、argument(nu) から int として 4 を受け取ります。私は以下の記述に疑問を持っています。
cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1)
return NULL;
up = (Header *) cp;
up->s.size = nu;
up はヘッダーへの単なるポインターです。しかし、それでもヘッダー変数を指していません。sbrk は要求されたメモリを割り当て、現在のプログラム ブレークを返し、cp に格納されます。次に、cp に格納されているアドレスがキャストされ、up に割り当てられます。現在、up には、ヘッダー変数へのポインターとして sbrk によって返されるアドレスが含まれています。すると次の発言が出てきます。
up->s.size = nu;
up
sbrk によって返されたアドレスのみが含まれます。次に、上記のステートメントが nu をサイズ変数に格納する方法。