У меня есть функция, которая возвращает const char*
,
В этой функции у меня есть следующие параметры:
string str;
Для преобразования ул в const char*
я использую str.c_str()
,
Когда я отлаживаю, я замечаю, что str.c_str()
содержит что-то (я думаю, его адрес) перед значением строки.
Например:
Если str = «0», то я str.c_str()
0x68d5f9 «0».
Почему это?
Как я могу получить только значение строки?
это не является проблема в том, как работают указатели.
Указатели указывают на данные, содержащиеся в какой-то адрес памяти и отладчик показывает вам, что этот указатель указывает на адрес 0x<something>
и значение по этому адресу '0'
, Здесь нет ничего странного.
Когда вы печатаете это значение, которое вы получили от str.c_str()
, вы получите обычную C-строку.
cout << str.c_str();
Это даст вам так же, как cout << str;
Вы не получите адрес, на который указывает указатель в строке, возвращаемой c_str
, Это артефакт отладчика, предназначенный для того, чтобы программисты могли проверить адрес вместе со значением.
Тем не менее, возвращая результат c_str
может быть неопределенным поведением, если вызов сделан для строки в функциональной области.
Например, это незаконно:
const char *illegal_return() {
string s = "quick brown fox";
return s.c_str(); // <<== Return of c_str from a local string
}
Лучшее решение — вернуть string
, Если вы хотите вернуть char
вместо указателя, вам нужно сделать копию:
char *legal_return() {
string s = "quick brown fox";
const char *ptr = s.c_str();
size_t len = strlen(ptr);
char *res = new char[len+1];
strcpy(res, ptr);
return res;
}
Вызывающая сторона вышеупомянутой функции должна вызвать delete[]
на результат, чтобы избежать утечек памяти.