Законно ли перезаписывать нулевой терминатор std :: string?
В C ++ 11 мы знаем, чтоstd::string
гарантированно будет как непрерывным, так и нулевым (или, более педантично, завершеннымcharT()
который в случаеchar
нулевой символ 0).
Мне нужен этот C API, который заполняет строку указателем. Он записывает всю строку + нулевой терминатор. В C ++ 03 я всегда был вынужден использоватьvector<char>
потому что я не мог предположить, чтоstring
был смежным или нулевым. Но в C ++ 11 (при условии надлежащего соответствияbasic_string
класс, который все еще сомнительный в некоторых стандартных библиотеках), я могу.
Или я могу? Когда я делаю это:
std::string str(length);
Строка будет выделятьlength+1
байты, с последним заполненным нулевым терминатором. Это хорошо. Но когда я передаю это C API, он собирается написатьlength+1
персонажи. Он будет перезаписывать нулевой терминатор.
По общему признанию, это собирается перезаписать нулевой терминаторwith a null character, Хорошие шансы, что это сработает (на самом деле, я не могу себе представить, как этоcouldn't Работа).
Но мне все равно, что «работает». Я хочу знать,according to the specМожно ли перезаписать нулевой терминатор нулевым символом?