2014-09-04 4 views
1

я получил следующую программу:C++ c_str() странное поведение

std::string f() { 
    return "f"; 
} 

std::string g() { 
    return "g"; 
} 

int main() { 
    const char *s = f().c_str(); 
    std::cout << "s = " << s << std::endl; 
    std::cout << "g() = " << g() << std::endl; 
    std::cout << "s = " << s << std::endl; 
} 

Я бы ожидать, чтобы увидеть s всегда распечатать "е", но следующее, что я получаю:

s = f 
g() = g 
s = g 

Я часами почесываю волосы, но до сих пор не понял, что происходит.

+1

Ваш указатель '' 'не указывает на действительный объект к моменту его попытки использовать, поскольку он указывает на данные временного строкового объекта, который не проживает достаточно долго. Вы вызываете * неопределенное поведение *. – juanchopanza

+2

+1 для обновления ПО после 3 дней позже, чтобы уточнить, что он/она не лысый –

ответ

2

Вашего указатель s недействителен при печати, так как временный std:string быть результат вызова f() уничтожается в тот момент (разрушение происходит на и ваше полное выражение в первой строке main функции) ,

Попробуйте это:

int main() { 
    std::string f_string = f(); 
    const char *s = f_string.c_str(); 
    std::cout << "s = " << s << std::endl; 
    std::cout << "g() = " << g() << std::endl; 
    std::cout << "s = " << s << std::endl; 
} 

Теперь он должен работать как струны c_str называется до сих пор в объеме при обращении указатель.

+0

Спасибо Криззу за ответ, теперь он становится намного понятнее. –

Смежные вопросы