Рассмотрим следующий код:
const char foo[] = "lorem ipsum"; // foo is an array of 12 characters
const auto length = strlen(foo); // length is 11
string bar(length, '\0'); // bar was constructed with string(11, '\0')
strncpy(data(bar), foo, length);
cout << data(bar) << endl;
Насколько я понимаю, string
всегда имеют скрытый нулевой элемент. Если это так, то bar
действительно выделяет 12 символов, причем 12 th является скрытым '\0'
, и это совершенно безопасно ... Если я ошибаюсь, тогда cout
приведет к неопределенному поведению, потому что нет нулевого терминатора.
Может ли кто-нибудь подтвердить для меня? Это законно?
Было много вопросов о том, почему использовать strncpy
вместо простого использования string(const char*, const size_t)
конструктора. Моим намерением было сделать мой игрушечный код близким к моему фактическому коду, который содержит vsnprintf
. К сожалению, даже после получения отличных ответов, я обнаружил, что vsnprintf
не ведет себя так же, как strncpy
, и задал следующий вопрос: Почему vsnprintf не записывает одинаковое количество символов как бы strncpy?