Время жизни данных, на которые указывает cc
, равно времени жизни строки, из которой они получены (в лучшем случае - если вы измените строку, она станет еще короче).
В вашем случае,возвращаемое значение foo()
является временным, которое уничтожается в конце инициализации cc
.
Чтобы избежать ошибки компиляции в char *cc = foo().c_str()
, вам не следует приводить к char*
, выследует переключиться на const char *cc
, поскольку const char*
- это то, что c_str()
возвращает.Это все еще не решает основную проблему.
Простейшие исправления:
printf("%s", foo().c_str()); // if you don't need the value again later
const string s = foo();
const char *cc = s.c_str(); // if you really want the pointer - since it's
// in the same scope as s, and s is const,
// the data lives as long as cc's in scope.
string s = foo();
printf("%s", s.c_str()); // if you don't store the pointer,
// you don't have to worry about it.
std::cout << foo(); // printf isn't bringing much to this party anyway.