Компилятор C позволяет явно запрашивать нулевой терминатор.
char a[] = "Hello"; /* adds a terminator implicitly */
char a[6] = "Hello"; /* adds a terminator implicitly */
char a[5] = "Hello"; /* skips it */
Любое значение меньше 5 приводит к ошибке.
Что касается того, почему - одна возможность состоит в том, что ваши строки имеют фиксированный размер или используются как буферы значений байтов. В этих случаях вам не нужен нулевой терминатор.
Рекомендуется использовать char a[]
, чтобы компилятор мог автоматически установить для него правильное значение (включая терминатор).