Я пытаюсь вернуть строку / символ (пробовал с обоими) из функции:
char* foo(void)
{
using namespace std;
// char Name[100];
std::string Name;
std::cout << "Type your name : ";
//std::getline(std::cin, Name);
std::cin >> Name;
// std::cout << "Hello " << Name << "\n";
// std::string str(Name);
return Name;
}
Что дает мне эту ошибку:
/home/peter/netsend/main.cpp:22: ошибка: невозможно преобразовать 'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}' в 'char *' в возвращаемом имени; ^
Если я использую char Name [100]; я получаю это предупреждение при компиляции своей программы:
/home/petter/netsend/main.cpp:13: предупреждение: возвращен адрес локальной переменной «Имя» [-Wreturn-local-addr] char Name [100]; ^
Когда я запускаю его, я получаю:
ype ваше имя: hh terminate вызывается после создания экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null недействительно Прервано (ядро выгружено)
Если я запустил это непосредственно в int main, он работает:
using namespace std;
// char Name[100];
std::string Name;
std::cout << "Type your name : ";
//std::getline(std::cin, Name);
std::cin >> Name;
// std::cout << "Hello " << Name << "\n";
// std::string str(Name);
Тогда я мог бы использовать Name в других моих функциях в int main. Любые идеи?
Благодарность
3 ответа
Просто верните string
, например:
auto foo()
-> std::string
{
using namespace std;
string Name;
cout << "Type your name : ";
getline( cin, Name );
return Name;
}
Или вместо синтаксиса "конечного возвращаемого типа" C ++ 11 используйте старый синтаксис
std::string foo()
… Что означает то же самое и по-прежнему встречается гораздо чаще, но не может использоваться во всех случаях.
Я разделю вашу проблему на случаи, которые опишу кратко.
Если вы создадите локальный массив, а именно
char Name[100]
, и вернете его, вы получитеdangling pointer
.Name[100]
- это переменнаяautomatic
, что означает, что как только функция выходит за пределы области видимости,pointer
, возвращаемый функцией, будет указывать на недопустимую ячейку памяти.return Name
, когдаName
являетсяstd::string
. Ну вот и несоответствие типов. Ваша функция возвращаетchar*
, а вы возвращаетеstd::string
. Следовательно, ваш компилятор выдает ошибку.
Чтобы устранить проблему, объявите Name
как std::string
и объявите функцию, возвращающую std::string
, например: std::string foo(void)
.
В первом случае вам, вероятно, следует вернуть string
(т.е. std::string foo(void) { ... }
), а затем просто использовать string::c_str()
, чтобы получить из него строку в стиле C, когда / при необходимости.
Во втором случае компилятор совершенно прав. Вы не можете безопасно использовать переменную после того, как ее область действия закончилась, это будет неопределенным поведением. Массив char
перестает существовать, когда функция завершается и вы возвращаете указатель на ее первый символ, большой no = -no.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.