-1

コード:

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;

upsbrk によって返されたアドレスのみが含まれます。次に、上記のステートメントが nu をサイズ変数に格納する方法。

4

1 に答える 1

0
// sbrk allocate "nu * sizeof(Header)" bytes at the address returned in cp.
cp = sbrk(nu * sizeof(Header));
// if cp is set to error return value (void *)-1 then cp is an invalid address.
if (cp == (char *) -1)
        return NULL;
// up is a pointer and its value is set to the new address (cp).
up = (Header *) cp;
// up is set to the new data allocated by sbrk in the memory. "->" will resolve the address in "up" and store the data.
up->s.size = nu;
于 2015-07-15T13:10:26.587 に答える