Ранее этот ответ имел неправильную информацию, этот случай не вызывает undefined behavior.
Отредактированный ответ:
TL; DR Мы не можем иметь окончательный ответ, код содержит индетерминисти- поведение.
Чтобы уточнить, char bar[128];
- это автоматическая локальная переменная и, если она не инициализирована явно, будет содержать неопределенные значения.
Цитирование C11
, глава §6.7.9
Если объект, который имеет автоматическую продолжительность хранения не инициализирована явно, его значение неопределенными. [....]
В вашем коде вы присвоили значение только для одного элемента массива в индексе 127. Остальные элементы все еще имеют неопределенное значение.
Попытка передать этот массив (указатель на первый элемент массива, в основном) в strlen()
, не вызывает чтение этих значений (в поисках нуль-терминатором) и из-за неопределенных значений, там нет убедитесь, что он найдет нуль-терминатор в любом , в частности.
- Это может очень хорошо найти нулевой терминатор (значение ASCII 0) в первом же элементе и возвращает 0.
- Он также не может найти нулевой терминатор (значение ASCII 0) в любом другом массиве элементов до последнего и возврата 127.
- Он может найти нулевой ограничитель в любом месте массива и вернуть его.
Итак, нет определенного ответа на этот вопрос.
Примечание:(сделать для моего неправильного понимания, чтобы предотвратить читатель от попадания в ту же самую ловушку дальнейшего)
Здесь, чтение неинициализированных значений (т.е. , неопределенные значения) не вызывает неопределенного поведения, как можно подумать.
Один лайнер: адрес берется для объекта.
Подробную информацию по этой теме см. here.
** нет ** из ваших возможных возможных ответов - это corect. – tofro
какой курс на coursera? – alinsoar
Безопасность программного обеспечения. Это «квалификационная викторина», которая предназначена для оценки того, можете ли вы завершить курс. –