That doesn't makes sense to me. Either you allocate the whole bunch of arrays at runtime, or a much less likely case, all the "inner dimension" arrays exist at compile time and you set a pointer to them in runtime, building up an array of pointers to (possibly multidimensional) arrays.
The latter version likely origins from flawed logic in the program design... you'd end up with code looking like this:
#define X 2
#define Y 10
#define Z 10
typedef int (*Array_ptr_type)[Y][Z];
int main()
{
int some_array [Y][Z];
int some_other_array [Y][Z];
Array_ptr_type* array_ptr;
array_ptr = malloc( X * sizeof(Array_ptr_type) );
array_ptr[0] = &some_array;
array_ptr[1] = &some_other_array;
free(array_ptr);
}
The above implementation is insane in most cases, plus it is hard to read and understand. I am quite certain the specific problem can be solved in a much easier way.