nkorobkov
@nkorobkov

Почему char занимает 1 байт, а строка с одним символом — 2 байта?

Слышал что-то про добавление в конце строк " \0 ", но не вдавался в подробности. Кто знает, ответьте пожалуйста!
  • Вопрос задан
  • 8211 просмотров
Решения вопроса 3
Все правильно, этот 1 байт занимает символ конца строки '\0'
Ответ написан
@redakoc
Существует 2 типа строк:

Типа С.
Тип Паскаль.

К языкам это не имеет отношения: язык Паскаль может использовать строки типа С, язык С может использовать строки типа Паскаль. Название просто исторически возникло, т.к. изначально в С и Паскале были только одного вида строки (разные, такие как описано ниже).

Строка типа С - это массив байтов, заканчивающийся нулем. То есть строка не может содержать символ с кодом 0 (не числом 0, а символ с кодом 0, нулевой байт). Длина строки всегда = количество символов + 1 байт (с нулевым кодом) в конце строки.

Строка типа Паскаль в начале хранит 1 байт, указывающий длину строки, затем идет массив символов. Строка может содержать внутри себя символы с кодом 0. Но не может быть длиннее 255 байт. В памяти такая строка занимает те же что и С = число символов в строке + 1 байт в начале, хранящий её длину.

А еще есть строки UNICODE, UTF8, строки типа Паскаль, где длина указана 2-мя байтами (т.е. максимальная длина 65535 символов в строке).

Длина таких строк в байтах может быть очень и очень разной. Совсем не соответствующей числу символов. Разница будет не на 1 байт (как в простых строках типа С и типа Паскаль). Более того, например, в UTF8 длина строки в байтах будет зависеть от того, что именно написано. )))

В наше время я настоятельно рекомендую изучать не простые char, а обратить внимание именно на UNICODE.
А там вовсе не один байт на один символ. )))))
Ответ написан
@abcd0x00
Нуль-символ обозначает конец строки. То есть строку можно читать, посимвольно смещаясь вправо, пока не встретится конец. Таким образом её длину хранить не нужно.
А теперь представь строку на миллиард символов. Для такой строки затраты на хранение её длины остаются теми же - один байт в котором записан нуль-символ.
А вот если бы длина строки хранилась в переменной, то нужно было бы следить за размером этой переменной, потому что на слишком длинных строках числовое значение длины не помещалось бы в переменную.
Ты думаешь, почему Дельфи такой медленный язык (программа The Bat! работает медленно), потому что там этого нет, из-за чего происходит множество лишних вычислений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@asd111
одна буква может иметь тип char или w_char
char - одна буква в кодировке ASCII занимает один байт
w_char - одна буква в кодировке UTF-16, занимает 2 байта
\0 - символ конца строки, используется для того чтобы printf и т.п. функции знали где заканчивается область памяти отведенная под строку.

const char *name = "name"; - символ конца строки поставит сам компилятор и длина строки будет не 4 байта, а 5, но при этом strlen должен возвращать длину до \0 т.е. 4 байта, хотя на самом деле хранится 5 байт

Примерно так. Другими словами если нужна строка, то нужно делать на 1 байт больше.
В этом плане проще использовать С++ std::string, std::wstring или Qstring
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы