Строка string эквивалентна массиву символов char

Строка string эквивалентна массиву символов char

Функция WriteFile() в параметры принимает указатель на строку(мне нужно передать строку СТРОГО ТИПА ЧАР) и число байт, которые нужно передать с точки, куда "указал".

Инициализировать строку типа char крайне не удобно в моем случае(в классе эти строки принимают всегда одно значение. не иниализировать же посимвольно!).

Вот и возникла потребность в Стринге. Он, кажется выделяет динамически char’ы, так что с типом параметра все ОК.

Но вот что меня волнует-т.к. память выделяется динамически, значит элементы в памяти идут не последовательно?! т.е. между элементами есть разрыв в памяти и тогда в моей передаче параметра будет логическая ошибка?!

Помогите разобраться, Пожалуйста:)

Как содержатся символы внутри std::string — внутреннее дело класса std::string , нас это не должно интересовать.

Однако у std::string есть функция c_str() , которая возвращает именно char* с последовательно расположенными символами. Она-то вам и нужна.

Открываем стандарт и читаем

The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s , the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 .

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

Но тип std::string имеет функцию c_str(), которая возвращает правильную c-строку (с нулем в конце). Длина строки также известна — функция length() или size() (эти функции — дубликаты, length создана исключительно для удобства). Правда завершающий ноль в эту длину не входит.

Но может быть и обычны с-строки хорошо заработают? Посмотрите на этот пример

Функция WriteFile() в параметры принимает указатель на строку(мне нужно передать строку СТРОГО ТИПА ЧАР) и число байт, которые нужно передать с точки, куда "указал".

Читайте также:  Проблемы с гидроусилителем руля тугой руль

Инициализировать строку типа char крайне не удобно в моем случае(в классе эти строки принимают всегда одно значение. не иниализировать же посимвольно!).

Вот и возникла потребность в Стринге. Он, кажется выделяет динамически char’ы, так что с типом параметра все ОК.

Но вот что меня волнует-т.к. память выделяется динамически, значит элементы в памяти идут не последовательно?! т.е. между элементами есть разрыв в памяти и тогда в моей передаче параметра будет логическая ошибка?!

Помогите разобраться, Пожалуйста:)

2 ответа 2

Как содержатся символы внутри std::string — внутреннее дело класса std::string , нас это не должно интересовать.

Однако у std::string есть функция c_str() , которая возвращает именно char* с последовательно расположенными символами. Она-то вам и нужна.

Открываем стандарт и читаем

The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s , the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 .

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

Но тип std::string имеет функцию c_str(), которая возвращает правильную c-строку (с нулем в конце). Длина строки также известна — функция length() или size() (эти функции — дубликаты, length создана исключительно для удобства). Правда завершающий ноль в эту длину не входит.

Но может быть и обычны с-строки хорошо заработают? Посмотрите на этот пример

Функция WriteFile() в параметры принимает указатель на строку(мне нужно передать строку СТРОГО ТИПА ЧАР) и число байт, которые нужно передать с точки, куда "указал".

Инициализировать строку типа char крайне не удобно в моем случае(в классе эти строки принимают всегда одно значение. не иниализировать же посимвольно!).

Читайте также:  Outlook 2010 просит пароль

Вот и возникла потребность в Стринге. Он, кажется выделяет динамически char’ы, так что с типом параметра все ОК.

Но вот что меня волнует-т.к. память выделяется динамически, значит элементы в памяти идут не последовательно?! т.е. между элементами есть разрыв в памяти и тогда в моей передаче параметра будет логическая ошибка?!

Помогите разобраться, Пожалуйста:)

2 ответа 2

Как содержатся символы внутри std::string — внутреннее дело класса std::string , нас это не должно интересовать.

Однако у std::string есть функция c_str() , которая возвращает именно char* с последовательно расположенными символами. Она-то вам и нужна.

Открываем стандарт и читаем

The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s , the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 .

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

Но тип std::string имеет функцию c_str(), которая возвращает правильную c-строку (с нулем в конце). Длина строки также известна — функция length() или size() (эти функции — дубликаты, length создана исключительно для удобства). Правда завершающий ноль в эту длину не входит.

Но может быть и обычны с-строки хорошо заработают? Посмотрите на этот пример

Ссылка на основную публикацию
Adblock detector