Функция 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 крайне не удобно в моем случае(в классе эти строки принимают всегда одно значение. не иниализировать же посимвольно!).
Вот и возникла потребность в Стринге. Он, кажется выделяет динамически 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 создана исключительно для удобства). Правда завершающий ноль в эту длину не входит.
Но может быть и обычны с-строки хорошо заработают? Посмотрите на этот пример