Хочу вернуть массив из функции, но вылетает ошибка, что делать? C++
Хотел сделать функцию, которая будет создавать массив и возвращать его в main, но что то пошло не так. Объясните где я не правильно сделал.
#include <iostream>
using namespace std;
int create_board () {
int board[10];
for (int i = 0;i<10;i++) {
board[i] = i;
}
return board;
}
int main () {
int board = create_board();
for (int i = 0;i<10;i++) {
cout >> board[i] << " ";
}
}
Ответы (3 шт):
Ты создал временный обьект на стеке, и вернул его. Компилятор должен был сказать что варнинг! выходя из стека ф-ии твой массив разрушается . Попробуй выделить массив динамически. Во вторых ты возвращал число , а не массив
Попробуй:
int* create_board () {
int* board = new int[10];
for (int i = 0;i<10;i++) {
board[i] = i;
}
return board;
}
Во-первых, в функции create_board переменная board у вас имеет тип const int * (т.е. массив значений int). А Вы пытаетесь присвоить это значение переменной типа int вот здесь:
int board = create_board();
что даёт ошибку несоответствия типов. Нужно заменить на:
int* board = create_board(); // Звёздочка после int
и объявление функции, соответственно, поменять на
int* create_board ()
Во-вторых, когда Вы делаете вот так:
int board[10];
память под массив выделяется в стеке (читайте подробности тут). А вся память, выделенная в стеке, очищается, при выходе соответствующей переменной из области видимости. Вкратце, как только выполнение Вашего кода доходит до фигурной скобки, завершающей функцию create_board, память массива board очищается и, следовательно, все значения в нём становятся недоступны. Отсюда и ошибка.
Теперь о том, что с этим делать. Если уж со стеком всё так плохо, нужно выделить память под массив в куче (в динамической памяти), заменив это:
int board[10];
на вот это:
int* board = new int[10];
Внимание, не забудьте очистить выделенную память, когда массив станет Вам не нужен, таким образом:
int* board = create_board(); // Создаёте массив
//... Используйте массив, как хотите
delete[] board; // Когда стал не нужен, чистите память
В-третьих, ну в конце-то концов, в какую сторону ставится знак помещения в поток после cout? В эту <<! А у Вас сначала в одну, потом в другую...
P.S. В блокноте Вы свой код пишете чтоли... IDE же большинство этих ошибок Вам сама рассказать должна была.
Массив нельзя вернуть из функции напрямую, но есть несколько обходных вариантов.
Про new и delete подсказали в соседних ответах, но это подходит только для практики. В реальной жизни возвращают контейнер: std::array или std::vector:
#include <array>
#include <iostream>
std::array<int, 10> create_board()
{
std::array<int, 10> board;
for (int i = 0; i < 10; i++)
board[i] = i;
return board;
}
int main()
{
std::array<int, 10> board = create_board();
for (int i = 0; i < 10; i++)
std::cout << board[i] << " ";
}
#include <iostream>
#include <vector>
std::vector<int> create_board()
{
std::vector<int> board;
for (int i = 0; i < 10; i++)
board.push_back(i);
return board;
}
int main()
{
std::vector<int> board = create_board();
for (int x : board)
std::cout << x << " ";
}
Есть еще один вариант: создавать массив снаружи функции, передавать его как параметр, и в функции заполнять:
#include <iostream>
void create_board(int *board)
{
for (int i = 0; i < 10; i++)
board[i] = i;
}
int main()
{
int board[10];
create_board(board);
for (int i = 0; i < 10; i++)
std::cout << board[i] << " ";
}