Как работает чтение за пределами буфера в C? и Почему 64?
Не "работает", это результат неопределенного поведения . Не существует элемента массива по адресу x[2]
.
получаем 0
? Почему {3}
не инициализировал и x[1]
?
Тем не менее, такой оператор, как
char x[2] = {3};
, создает массив x
, с двумя элементами, к которым обращаются x[0]
и x[1]
, и инициализирует x[0]
значением 3, а любой оставшийся элемент - 0
(в соответствии с правилами инициализации, где количество элементов инициализатора меньше, чем элементов массива). Таким образом, {3}
не инициализирует все элементы массива значением 3
, а устанавливает значение только первого элемента.
Цитирование C11
, глава 6.7.9 / P21
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве остальная часть агрегата должна быть неявно инициализирована так же, как объекты, которые имеют c срок хранения.