en este código:
#include <stdio.h> int main(void) { int a[2][3] = {{1,2},{4,5,6}}; printf("%d\n",a[0][2]); return 0; }
El resultado es 0
: dado que la matriz no se inicializó, ¿este resultado es el resultado de algún comportamiento indefinido?
La matriz se inicializó. Está definiendo una matriz bidimensional que consta de dos matrices de tres enteros cada una. Para el primero de estos dos, solo proporciona dos valores y, de forma predeterminada, el que falta se inicializa como cero, por lo que su matriz completa es {{1, 2, 0}, {4, 5, 6}. a[0][2] te dará ese cero.
Del Estándar C (6.7.9 Inicialización)
19 La inicialización debe ocurrir en el orden de la lista de inicializadores, cada inicializador provisto para un subobjeto en particular anula cualquier inicializador enumerado anteriormente para el mismo subobjeto; 151) todos los subobjetos que no se inicializan explícitamente se inicializarán implícitamente al igual que los objetos que tienen una duración de almacenamiento estático .
y
10 Si un objeto que tiene duración de almacenamiento automático no se inicializa explícitamente, su valor es indeterminado. Si un objeto que tiene una duración de almacenamiento estático o de subprocesos no se inicializa explícitamente, entonces:
— si es de tipo aritmético, se inicializa a cero (positivo o sin signo);
De hecho, esta declaración
int a[2][3] = {{1,2},{4,5,6}};
es equivalente a
int a[2][3] = {{1,2, 0},{4,5,6}};