C99なら似たようなことは可能
struct frame {
int foo;
};

struct block {
unsigned size;
struct frame *buf[];
};

void *
malloc();

foo(bufs, nbufs)
int *bufs;
unsigned nbufs;
{
struct block *blk = 0;

blk = malloc(sizeof(struct block) + sizeof(struct frame *)*nbufs);
blk->size = nbufs;
for ( unsigned i = 0; i < nbufs; ++i ) {
blk->buf[i] = malloc(sizeof(struct frame)*(i+1));
}

return 0;
}
規格のセクションは、ガチ規格スレで聞いてくれたら答える