В первом случае
str.copy(cstr, std::min(str.size(), sizeof(cstr) / sizeof(cstr[0]) - 1));
количество копируемых символов ограничено значением sizeof( cstr ) - 1
.
Таким образом, массив cstr
содержит строку, потому что она была нулевой -initialized.
Во втором случае вы не ограничивали количество копируемых символов.
strcpy(cstr2, str2.c_str());
Таким образом, память вне массива cstr2
была перезаписана, поскольку строка, на которую указывает str2.c_str()
содержит больше символов, чем размер массива cstr2
.
Вместо этого вы можете написать
strncpy( cstr2, str2.c_str(), sizeof( cstr2 ) - 1 );
, используя функцию strncpy
.