In C, while using multi dimensional arrays the parameter declaration must include the all other dimensions except the first dimension. Specifying the first dimension i.e. the number of rows is optional.
Here, M is an array of 10 pointers. The definition of M however only allocates 10 pointers and does not initialize them; initialization must be done explicitly, either statically or with code. So M[3] and M[2][4] both are valid as the latter refers the data to which the pointer points to.
N[2][4] is clearly valid as N is a true 2-dimensional array.
But N[2] is invalid as we are not specifying the relevant 2nd dimension here and hence the compiler will give an error.
So, D is the answer.