Существует два распространенных способа обработки массивов, которые могут иметь содержимое различной длины (например, Strings).Первый - отдельно хранить длину данных, хранящихся в массиве.Такие языки, как Fortran и Ada и std :: string в C ++, делают это.Недостатком этого является то, что вам нужно как-то передавать эту дополнительную информацию всему, что имеет дело с вашим массивом.
Другой способ - зарезервировать дополнительный элемент, не являющийся данными, в конце массива, чтобыслужить в качестве дозорногоДля стража вы используете значение, которое никогда не должно появляться в реальных данных.Для строк 0 (или «NUL») - хороший выбор, поскольку он не печатается и не служит никакой другой цели в ASCII.Итак, что делает C (и многие языки, скопированные с C), это предполагает, что все строки заканчиваются (или «заканчиваются») на 0.
У этого есть несколько недостатков.Во-первых, это медленно.Каждый раз, когда подпрограмме нужно знать длину строки, это операция O (n) (поиск по всей строке в поисках 0).Другая проблема заключается в том, что вы можете однажды захотеть поставить 0 в вашей строке по какой-то причине, так что теперь вам нужен целый второй набор строковых подпрограмм, которые игнорируют нуль и в любом случае используют отдельную длину (например, strnlen ()).Третья большая проблема заключается в том, что если кто-то забудет поставить этот 0 в конце (или он каким-то образом уничтожен), следующая строковая операция, выполняющая дополнительную проверку, будет весело перемещаться по памяти, пока не произойдет случайный поиск другого 0,падает, или пользователь теряет терпение и убивает его.Такие ошибки могут быть серьезной PITA для отслеживания.
По всем этим причинам подход C обычно рассматривается с пренебрежением.