void **Alloc2(size_t x, size_t y, size_t size)
{
    void **p = malloc(sizeof (void *) * x);
    void *pY = malloc(size * x * y);
    size_t i;
    for (i = 0; i < x; i++)
        p[i] = pY + i * y;
}

void Free2(void **pp)
{
    free(*pp);
    free(pp);
}

こう使える。
int **p = (int **)Alloc2(3, 4, sizeof (int));
// >>588の後半
Free2((void **)p);