Это приведет к краху из-за модели памяти.
В C++ (как на многих других языках) есть два двух популярных места, где вы можете выделить память: стек и кучу.
В C++ стек представляет собой специальную область памяти, где функции размещают любые значения, которые им понадобятся во время их выполнения. Самое главное помнить, что все, что там происходит, возвращается после возвращения функции. Это означает, что если вы вернете указатель на что-то в стеке, ваша программа обязательно рухнет, потому что все, что было там, больше не существует. Это то, что вы будете делать, если вы вернете массив.
Надеюсь, есть место, где данные могут жить вечно («навсегда» - это продолжительность вашей программы): куча. Если вы выделите что-то в куче, он не будет очищен, когда функция вернется. Однако это подразумевает дополнительную бухгалтерскую отчетность, поскольку вы можете легко потерять все ссылки на определенный блок выделенной памяти; и если вы это сделаете, нет способа вернуть его (это называется утечкой, и это очень плохо). Поэтому было предложено правило: если функция выделяет память в куче, она должна нести ответственность за ее освобождение. Проблема в том, что если ваша функция возвращает выделенную память, она не может ее избавиться. Поэтому вы не должны выделять память в куче и возвращать ее.
Итак, если вы не можете выделить свой массив в стеке, и вы не можете вернуть указатель на память в кучу, что вы можете сделать?
Предлагаю вам использовать типы C++ для решения вашей проблемы. Если вы собираетесь использовать массив символов, лучшим будет std::string
(#include <string>
). Если вы собираетесь использовать массив любого другого, лучшим может быть std::vector<YourTypeHere>
(#include <vector>
). Оба управляют своей собственной памятью, и поэтому их можно вернуть.
Существует достаточно документации для обоих здесь и в Google. В любом случае, это быстрый пример.
std::vector<int> foo()
{
std::vector<int> my_vector;
my_vector.push_back(1);
my_vector.push_back(2);
my_vector.push_back(3);
return my_vector;
}
std::string bar()
{
std::string my_string = "The quick brown fox jumps over the lazy dog";
return my_string;
}
int main()
{
std::vector<int> my_vector = foo();
// will print 123
std::cout << my_vector[0] << my_vector[1] << my_vector[2] << std::endl;
std::string my_string = bar();
// will print The quick brown fox jumps over the lazy dog
std::cout << my_string << std::endl;
}
Возвращаемый тип этой функции один символ - не массив символов. Тем не менее, указание типа возврата массива не поможет - см. Ответы о пшеницах. – Steve314 2010-11-23 06:05:22