C++ Возврат массивов из функций
C++ не позволяет возвращать полный массив в качестве аргумента функции. Однако можно вернуть указатель на массив, указав имя массива без индекса.
Если вы хотите вернуть одномерный массив из функции, необходимо объявить функцию, возвращающую указатель, следующим образом:
Следующий пример:
Пример
{
int myArray[3] = {1, 2, 3};
return myArray;
}
Примечание:Нельзя просто вернуть указатель на локальный массив, потому что при завершении функции локальный массив будет уничтожен, и указатель на него станет недействительным.
C++ не поддерживает возврат адреса локальной переменной за пределы функции, если локальная переменная не определена какstaticпеременная.
Чтобы избежать вышеописанной ситуации, можно использовать статический массив или динамически выделенный массив.
Использование статического массива требует создания статического массива внутри функции и возврата его адреса, например:
{
static int myArray[3] = {1, 2, 3};
return myArray;
}
Теперь давайте рассмотрим следующую функцию, которая генерирует 10 случайных чисел и использует массив для их возврата, следующим образом:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
624723190 1468735695 807113585 976495677 613357504 1377296355 1530315259 1778906708 1820354158 667126415 *(p + 0) : 624723190 *(p + 1) : 1468735695 *(p + 2) : 807113585 *(p + 3) : 976495677 *(p + 4) : 613357504 *(p + 5) : 1377296355 *(p + 6) : 1530315259 *(p + 7) : 1778906708 *(p + 8) : 1820354158 *(p + 9) : 667126415
Использование динамически выделяемого массива требует использования оператора new внутри функции для выделения массива и оператора delete для освобождения массива, когда функция завершается, например:
Пример
{
int* myArray = new int[3];
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
return myArray;
}
int main()
{
int* result = myFunction();
// Используйте result
delete[] result;
return 0;
}
Ниже приведён простой пример приложения, демонстрирующий, как вернуть массив из функции:
Пример
using namespace std;
int* createArray(int size) {
int* arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
}
return arr;
}
int main() {
int* myArray = createArray(5);
for (int i = 0; i < 5; i++) {
cout << myArray[i] << " ";
}
cout << endl;
delete[] myArray; // освобождение памяти
return 0;
}
В приведённом выше примере мы объявили функцию с именем createArray, которая принимает целочисленный параметр size и возвращает целочисленный массив, заполненный целыми числами. Мы использовали оператор new для динамического выделения массива в куче и заполнили массив внутри функции. В конце функция вернула указатель на массив.
В функции main мы вызвали функцию createArray и сохранили возвращённый указатель на массив в myArray. Затем мы прошли по массиву и вывели значение каждого элемента. Наконец, мы использовали оператор delete[], чтобы освободить память, занятую myArray, во избежание утечки памяти.
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
1 2 3 4 5
Примечание:При использовании динамически выделенного массива код, вызывающий функцию, отвечает за освобождение возвращённого массива. Это связано с тем, что массив, выделенный внутри функции, не освобождается автоматически при завершении функции.
Другие расширения