Вы кодируете только первую ячейку в массиве, измените строку
int a[3][3] = {0};
на
int a[3][3] = {1};
и посмотрите вывод, только первая ячейка будет одна иостальное будет равно нулю.
о вопросе компиляции, я компилирую с GCC, и оба компилируются для меня.Разница между типами инициализации заключается в том, что
int a[3][3] = {1,2,3,4,5};
будет компилироваться, вы получите
1 2 3
4 5 0
0 0 0
Но int b [3] [3] = {{1,2,3, 4}};Не будет компилироваться из-за
слишком большого числа инициализаторов для 'int [3]' Это произойдет, потому что {{}} будет инициализировать только первый массив a [3] в a [3] [3матрицаЕсли вы хотите инициировать все это, вам нужно назвать его так:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};