Язык C был создан почти полвека назад; несмотря на то, что он и сегодня остаётся "вполне себе ничего", его всё больше "тянет вниз" груз технических решений, которые на момент их принятия казались создателям оптимальными. Одним из таких решений стало использование нулевого байта для обозначения конца строки вместо хранения её длины. За счёт выигрыша в виде пары-тройки байт памяти на строку, что было вполне рациональным решением в то время, сейчас мы получаем:

  • трудности с хранением нулевого байта в строке;
  • линейную сложность получения длины строки, которая влияет и на производительность других строковых операций;
  • гигантское количество ошибок и уязвимостей, связанных с переполнением строковых буферов.

Все эти проблемы (и некоторые другие) описаны в замечательной статье The Most Expensive One-byte Mistake. К сожалению, мы ничего не может с этим поделать, не отказавшись от полувековой истории и тысяч легаси-приложений. Или всё-таки можем?