Вопрос
Пишу такой код:
QString logFileName="/Directory/Logs/Log.txt";
qDebug() << "Log file name: " << logFileName;
const char *fileName = logFileName.toStdString().c_str();
printf("Const char * filename: ");
printf(fileName);
printf("\n");
И на экране получаю кракозябры вместо fileName:
Log file name: "/Directory/Logs/Log.txt"
Const char * filename: X���[
Я давно с сишными низкоуровневыми делами не работал.
Вопрос: почему кракозябры вместо строки?
Ответ
Ага, понял. Походу когда срабатывает toStdString(), создается временный объект типа std::string. Потом для этого временного объекта вызывается c_str(). Полученный указатель запоминается в fileName, но затем временный объект удаляется, и начинается выполнение следующей команды.
Другими словами: если приравнять значение переменной и использовать его:
const char *fileName = logFileName.toStdString().c_str();
printf(fileName);
то будет ошибка по вышеописанной причине.
А если использовать напрямую:
printf(logFileName.toStdString().c_str());
то ошибки не будет, потому что в C++ подстановка rvalue в функцию будет держать временные объекты на стеке до выхода из этой функции.