Это, как правило, не безопасно, независимо от того, сохраняется ли внутренняя последовательность строк в памяти непрерывно или нет. Может быть много других деталей реализации, связанных с тем, как контролируемая последовательность хранится объектом std::string
, помимо непрерывности.
Настоящая практическая проблема с этим может быть следующей. Управляемая последовательность std::string
не требуется хранить в виде строки с нулевым завершением. Однако на практике многие (большинство?) Реализаций выбирают, чтобы увеличить внутренний буфер на 1 и сохранить последовательность как строку с нулевым завершением, так как она упрощает реализацию метода c_str()
: просто верните указатель на внутренний буфер, и вы сделанный.
Код, указанный в вашем вопросе, не прикладывает никаких усилий для нулевого завершения копирования данных во внутренний буфер. Вполне возможно, что он просто не знает, требуется ли нулевое завершение в этой реализации std::string
. Вполне возможно, что он полагается на заполнение внутренним буфером нулей после вызова resize
, поэтому дополнительный символ, выделенный для нулевого терминатора реализацией, удобно предварительно установлен на ноль. Все это детализация реализации, что означает, что этот метод зависит от некоторых довольно хрупких предположений.
Другими словами, в некоторых реализациях вам, вероятно, придется использовать strcpy
, а не memcpy
, чтобы принудительно вводить данные в управляемую последовательность. Хотя в некоторых других реализациях вам нужно будет использовать memcpy
, а не strcpy
.
Использование & s [0] в порядке, memcpy(), возможно, меньше. Почему бы просто не выполнить назначение или использовать функцию assign() функции string? – 2009-12-31 20:26:02
@Neil Butterworth, вот что я задаю себе, глядя на этот код ...;) – paxos1977
По мере того, как вы получаете опыт программирования на C++, вы будете воздерживаться от использования 'memset' и' memcpy' и учиться рассуждения. Это одно, чтобы добавить к вашему опыту. –