Вы, похоже, неправильно поняли, для чего полезно NUL-завершение. В C строки могут быть представлены только как последовательности байтов. Для работы со строкой существует два основных метода:
- Всегда знать ее длину и каждый раз передавать ее.
- Не знать ее длину, но использовать уникальный байт терминатора (байт NUL
\0
), так что любой код, сканирующий строку, может идентифицировать, когда достигнут конец.
Конечно, использование терминатора NUL применимо только к строкам, и более точно, когда речь идет о функциях, которые ожидают завершение строки как NUL: все стандартные функции библиотеки C делают. Можно было бы очень хорошо написать свою собственную библиотеку с функциями, которые обрабатывают строки, не заканчивающиеся NUL.
Если вы имеете дело с массивами generi c char
(или unsigned char
), есть нет необходимости завершать их NUL , если вы не собираетесь использовать их в качестве строк.
В дополнение к вышесказанному терминатор NUL неявно добавлен только для объявлений с использованием строковых литералов, например:
char foo[] = "hello";
// foo actually contains 'h' 'e' 'l' 'l' 'o' '\0'
Но не при объявлении char
массивов:
char foo[] = {'h', 'e', 'l', 'l', 'o'};
// foo actually contains 'h' 'e' 'l' 'l' 'o'
Объявление массивов с инициализаторами, меньшими чем размер массива приводит к заполнению остальных слотов нулями, но это другая история:
char foo[5] = {'h', 'i'};
// foo actually contains 'h' 'i' '\0' '\0' '\0'
Отвечая на ваш вопрос в комментариях:
* 1038 Отсутствие завершения NUL дает другим программистам возможность неправильно использовать переменную. Является ли возможность неправильного использования проблемой? Я собираю из ответов здесь, что это не так.
Это не так, если вы используете значимые имена и убедитесь, что ясно, что переменная не представляет строку, когда вы не намереваться это.