как установить значение char * из строки std (c_str ()) не работает - PullRequest
5 голосов
/ 10 мая 2011

я не знаю, но это не работает для меня, я получаю значение garbege, когда я пытаюсь установить значение char * из функции, которая возвращает строку std:

string foo()
{
  string tmp ="dummy value";
  return tmp;
}

char* cc = (char *) foo().c_str(); // if i remove the casting im getting error 
// when i print the cc i get garbage 
printf("%s",cc);

Ответы [ 5 ]

13 голосов
/ 10 мая 2011

Время жизни данных, на которые указывает 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.
9 голосов
/ 10 мая 2011

Результатом foo является временный объект, который уничтожается к концу строки char * cc = ....Храните его в постоянной ссылке:

const string& cc = foo();
printf ("%s", cc.c_str());
1 голос
/ 10 мая 2011

Передайте расположение памяти в foo () и заставьте foo изменить это:

void foo (string* _out_newStr)
{
    _out_newStr->assign("dummy string"); //This is wrong -> _out_newStr = "dummy string";
    return;
}

Тогда, когда вы используете функцию "c_str ()" строкового объекта, вы вернете значение const char *, как уже указывалось.

0 голосов
/ 10 мая 2011

Как насчет:

printf("%s", foo.c_str() );

Или, что еще лучше, забудьте об использовании указателей символов.

0 голосов
/ 10 мая 2011

Фрагмент кода вызывает неопределенное поведение, потому что временный std::string, созданный из вызова, уничтожается в конце выражения, но cc, который указывает на уничтоженный объект, все еще используется даже после этого.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...