Оба фрагмента кода недопустимы.
В первом фрагменте кода массив имеет автоматическую c продолжительность хранения и не инициализируется. Поэтому его элементы имеют неопределенные значения. В результате программа имеет неопределенное поведение.
Во втором фрагменте кода используется недопустимая конструкция для инициализации массива
int arr[4] = {};
, вы не можете использовать пустые скобки в C ( хотя это действительно в C ++). Эта конструкция может быть заданным c расширением компилятора C. Правильная инициализация будет выглядеть следующим образом:
int arr[4] = { 0 };
Когда инициализируется меньше, чем количество инициализированных элементов, элементы, не имеющие явных инициализаторов, инициализируются нулями.
Из C Стандарт (6.7.9 Инициализация)
21 Если в списке в скобках меньше инициализаторов, чем элементов или элементов агрегата или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементы в массиве, оставшаяся часть агрегата должна быть неявно инициализирована так же, как и объекты, которые имеют c продолжительность хранения.
и
10 Если объект, имеющий автоматическую c продолжительность хранения, не инициализирован явно, его значение является неопределенным. Если объект, который имеет статическое или потоковое время хранения, не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметику * Тип 1055 *, он инициализируется нулем (положительным или без знака);
- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами, а любое заполнение инициализируется нулевыми битами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами, а любое заполнение инициализируется нулевыми битами;
Итак, в этом объявлении первый элемент массива инициализируется явно 0, а все остальные элементы массива инициализируются неявно компилятором с 0.
В C такая инициализация
int arr[4] = { 0 };
эквивалентна следующая форма инициализации
int arr[4] = { [0] = 0 };
или, например, следующая форма
int arr[4] = { [3] = 0 };
, или вы даже можете опустить номер элемента вводится в объявление массива как, например,
int arr[] = { [3] = 0 };
То есть все элементы, которые не имеют явного инициализатора, будут инициализироваться нулями.