Как работает чтение за пределами буфера в C? - PullRequest
1 голос
/ 09 июля 2020

Создайте этот x.c тестовый файл:

int main(void)
{
  char x[2] = {3};
  return x[2];
}

Затем запустите

gcc x.c; ./a.out; echo $?

Результат: 64.

Почему 64?

Кстати, а почему, если мы используем

return x[1];

, получаем 0? Почему {3} не инициализировал и x[1]?

1 Ответ

6 голосов
/ 09 июля 2020

Как работает чтение за пределами буфера в 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 срок хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...