new_block = malloc( offsetof( strblock, data[nalloc] ) );
new_block = malloc( offsetof( strblock, data[0] ) + nalloc * sizeof(new_block->data[0]) );
static char* allocate(size_t n){    /* See if we can grab storage from an existing block */    size_t remaining = storage_finish - storage_start;    if ( remaining >= n )    {        char* result = storage_start;        storage_start += n;        return result;    }    else /* Must allocate a new block */    {        strblock* new_block;        size_t nalloc = n;        if ( nalloc < STRING_BLOCK )            nalloc = STRING_BLOCK;        /* allocate a new block and link into the chain */        new_block = malloc( offsetof( strblock, data[nalloc] ) );        if ( new_block == 0 )            return 0;        new_block->next = strblock_chain;        strblock_chain = new_block;        /* Take future allocations out of the larger remaining space */        if ( remaining < nalloc - n )        {            storage_start = new_block->data + n;            storage_finish = new_block->data + nalloc;        }        return new_block->data;    }}