¿C99 garantiza que las matrices son contiguas?

Después de un hilo de comentarios en otra pregunta, llegué a debatir sobre qué es y qué no está definido en el estándar C99 sobre los arreglos en C.

Básicamente cuando defino una matriz 2D comoint a[5][5], ¿garantiza la C99 estándar o no que será un bloque contiguo de entradas? ¿Puedo enviarlo a(int *)a y asegúrese de tener una matriz 1D válida de 25 ints.

Según entiendo el estándar, la propiedad anterior está implícita en el tamaño de la definición y en la aritmética del puntero, pero otros parecen estar en desacuerdo y dicen que la conversión a (int *) de la estructura anterior da un comportamiento indefinido (incluso si están de acuerdo en quetodas las implementaciones existentes en realidad asignan valores contiguos).

Más específicamente, si pensamos en una implementación que instrumente las matrices para verificar los límites de la matriz para todas las dimensiones y devolver algún tipo de error al acceder a la matriz 1D, o no da acceso correcto a los elementos por encima de la primera fila. ¿Podría tal implementación ser estándar? Y en este caso, qué partes del estándar C99 son relevantes.

Respuestas a la pregunta(1)

Su respuesta a la pregunta