Я использую библиотеку C в C++ и написал обертку. В какой-то момент мне нужно преобразовать std::string
в строку c-style. Существует класс с функцией, которая возвращает строку. Выполнение возвращенной строки выполняется, если строка короткая, в противном случае - нет. Вот простой и уменьшенный пример, иллюстрирующий проблему:Кастинг c_str() работает только для коротких строк
#include <iostream>
#include <string>
class StringBox {
public:
std::string getString() const { return text_; }
StringBox(std::string text) : text_(text){};
private:
std::string text_;
};
int main(int argc, char **argv) {
const unsigned char *castString = NULL;
std::string someString = "I am a loooooooooooooooooong string"; // Won't work
// std::string someString = "hello"; // This one works
StringBox box(someString);
castString = (const unsigned char *)box.getString().c_str();
std::cout << "castString: " << castString << std::endl;
return 0;
}
Отработка файл выше принтами на консоль:
castString:
а если я своп комментируя someString
, он правильно печатает
castString: привет
Как это возможно?
Спасибо, это имеет смысл! Самое смешное, что код работал отлично в течение нескольких месяцев в моей другой системе. Только теперь, когда я обновил Ubuntu с 14.04 до 15.10 и переустановил все, что он изменил. Я предполагаю, что это неопределенное поведение ... – Cat
И спасибо за разработку. Можете ли вы объяснить, что вы подразумеваете под «не очень хорошей идеей»? Или вы имеете в виду мою ошибку при вызове c_str() объекта, возвращаемого функцией? – Cat
Я думаю, что легкое исправление: 'std :: cout <<" castString: "<< (const unsigned char *) box.getString(). C_str() << std :: endl;' – chqrlie