Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Хранится ли в конце string терминальный символ?

#c++


Хранится ли в конце строк типа string терминальный символ?
    


Ответы

Ответ 1



Да. Или, как минимум, для него зарезервировано место и подделано его значение. Это было бы нерационально, но не запрещено и потому может иметь место. С C++11 это гарантируется, потому что метод c_str у std::string должен (а) работать за константное время и (б) возвращать указатель непосредственно на внутренний буфер объекта-строки. This array includes the same sequence of characters that make up the value of the string object plus an additional terminating null-character ('\0') at the end. — cplusplus.com, std::string::c_str Хотя когда работа идёт с самим std::string (а не его C-совместимым кусочком), терминальный символ может и не играть своей роли, и можно считать, что он не существует. Терминальным он является только для алгоритмов, которые эту строку используют.

Ответ 2



Стандарт гарантирует, что если у std::string запросить последний символ тем или иным способом (например через operator[] с аргументом size()), то вернется символ, аналогичный сконструированному вызовом char(), т.е. 0. Так что можно сказать, что 0 существует в конце строки. При этом в Стандарте всё же присутствует некоторая несогласованность. Например, описание конструктора, который вызывается конструктором по умолчанию, гласит, что: функция-член data() после инициализации объекта возвращает не-нулевой указатель, по которому может содержаться 0. Т.е. может, но не обязан. При этом для значения, полученного через data() справедливо равенство: p + i == &operator[](i), для всех i в диапазоне [0, size()] А учитывая работу operator[], о чем сказано в самом начале моего ответа, получается, что 0 всё же не просто может, а обязан существовать в памяти.

Комментариев нет:

Отправить комментарий