It will become a little clearer if you reduce the number of dimensions. Let's be bold, remove all but one dimension, and declare
extern double foo[];
What this does is declare an incomplete type, an array of an unknown number of doubles. The type would be complete if you gave an explicit number of elements. The difference is that you can't apply the sizeof to incomplete types: the compiler can't know their size because they are, well, incomplete.
Now if we declare an array of arrays we can't have both dimensions be unknown (like in double foo[][]). Why is that? Previously the compiler could compute the location of foo[42] because it knows the size of a double (because double is a complete type). To compute foo[1][42] it must know the size of the element type. In other words, element types must be complete. In C the rightmost dimension varies fastest, so the element type here is given by all but the leftmost dimension: double [42] and in your original question it is double [2][9][11].
At the end of the day, you can leave the leftmost dimension blank if you don't need the size of the complete array.