一次配列で確保して、インデックスで多次元配列のように使うのが一手かな。

int *pi = (int *)malloc(2*3*4);
#define MULTIARRAY(i0, i1, i2) \
pi[((i0) * 3 + (i1)) * 4 + (i2)]

これだと区間チェックがないから、本番ではもっと改良が必要だけど。