You didn't mention where this is, I can think of two valid places:
GLfloat colours[][3] =
{
{ 1.0, 1.1, 1.2 },
{ 1.3, 1.4, 1.5 },
<and on and on>
};
In this case, the declaration fixes the size based on how many initializers you give it. So it IS a fixed number, but you didn't have to tell the declaration syntax how many.
The other case is like this:
void PrintColorArray( GLfloat colours[][3] ) // heck in the USA we spell differently
{
for (int i = 0; i < ?????; i++) // what do we fill in here?
printf( "Color %d is %f,%f%f\n", i, colours[i][0], colours[i][1], colours[i][2] );
}
In this case you have to somehow know at run time how big the array is; for example as a parameter to the function.
In this second case, you could pass many different arrays with different sizes to this routine (as long as they were triplets of GLfloats).