Comments

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:

It depends. If "int arr[][20]" is declared as an argument of a function, then I don't think that there is a problem; arr gets pointed to some already allocated memory that was pointed to by the array passed as an argument.