Зачем нужен нулевой терминатор?

В последние пару дней я учил себя с ++, чтобы подготовиться к первокурсному обучению по специальности CS. Я сейчас в строках в стиле C, и мне интересно, в чем смысл нулевого терминатора.

Я понимаю, что это необходимо, но, думаю, я просто не понимаю, почему строка не заканчивается только на последнем символе.

4

Решение

Я просто не понимаю, почему строка не заканчивается на последнем символе.

Есть несколько способов узнать, где находится «последний символ»:

  1. Сохраните количество символов в строке отдельно от символов строки,
  2. Поместите маркер, который указывает последний символ строки, или
  3. Сохраните указатель на последний символ строки отдельно от символов строки.

С выбрать второй маршрут; другие языки (Паскаль и т. д.) выбирают первый маршрут. Некоторые реализации C ++ std::string выберите третий маршрут* .


* Четное std::string реализации, которые используют первый или третий подход, заканчивают свои буферы нулевым завершением для совместимости с частями C библиотеки. Это необходимо для того, чтобы c_str() возвращает допустимую строку C.

17

Другие решения

В C и C ++ c-строки хранятся в массиве символов. Чтобы разрешить строки различной длины, эти массивы часто выделяются намного больше, чем фактические строки, которые они должны содержать. Например, программист может выделить char[256] массив, который может содержать строку длиной от 0 до 255 символов. Но компьютер должен точно знать, какой длины строка на самом деле, поэтому он должен заканчиваться нулевым символом. В противном случае было бы необходимо, чтобы длина символьного массива была точно такой же, как и у строки (непрактичное решение, так как при распределении и копировании памяти используется много ресурсов).

2

Потому что строка в стиле c не знает, какой символ является последним. Например, если вы читаете имя, вы можете создать буфер следующим образом:

char buf[256] // this allows c-style strings that contain 255 characters

Но когда вы заполняете этот буфер, вы не можете (скорее всего, не) использовать все пространство. Если вы заполните его «Джек», единственная информация, которая вас волнует, это первые пять индексов, а не все 256.

0

Рассмотрим каждый символ строки как блоки памяти в памяти.
Если строка помещена в память. После этого рядом с ним помещается еще одна строка, и компьютер будет считать, что вторая строка соединена с первой, если отсутствует ноль. Итак, null действует как разделитель

0
По вопросам рекламы [email protected]