Depende del estándar bajo el cual se compile el programa.
* En C90 deben colocarse primero las sentencias declarativas (declaraciones) y solo después las ejecutivas (sentencias). Y cuando se declara un array debe indicarse su numero de elementos mediante una expresión entera mayor que cero y calculable en tiempo de compilación (constante). Compilando en este modo se genera el mensaje de error mencionado, este se describe en MSDN en la pagina
Compiler Error C2143.
* En C99 se puede al igual que C++ intercalar sentencias de ambos tipos y también puede indicarse el numero de elementos de un array mediante una expresión que no sea constante, a estas se les llama "arrays de longitud variable" o en ingles VLAs (variable length arrays).
Por ultimo para conocer a detalle el lenguaje C la referencia mas completa y correcta son sus estándares C90, C99 y C11. Se pueden comprar en la pagina de la ISO o se puede optar por la opción mas cercana y gratuita que son los borradores (buscar en Google N1256 y N1570).
Pero hay que aclarar que no son documentos para principiantes, para estos mejor un buen libro.
Un saludo