Как вернуть массив из функции c
Перейти к содержимому

Как вернуть массив из функции c

  • автор:

Как вернуть массив в функции C++

В этом уроке мы собираемся понять, как мы можем вернуть массив из функции в C++.

Методы возврата массива в функции C++

Как правило, возврат всего массива в вызов функции невозможен. Мы могли сделать это только с помощью указателей.

Более того, объявление функции с возвращаемым типом указателя и возвратом адреса массива типа C в C++ работает не во всех случаях. Компилятор выдает предупреждение о возврате локальной переменной и даже показывает ненормальное поведение на выходе.

Следовательно, вернуть массив из функции в C++ не так просто. Но мы можем добиться этого, следуя любому из нижеперечисленных методов.

Давайте приступим к делу.

1. Использование указателей

Как мы упоминали ранее, возврат обычного массива из функции с помощью указателей иногда дает нам неожиданные результаты. Но такого поведения и предупреждений можно избежать, объявив массив static .

Давайте посмотрим, как.

#include using namespace std; int* demo() //return type- address of integer array < static int a[5]; //array declared as static for(int i = 0; ireturn a; //address of a returned > int main() < int* ptr; //pointer to hold address int i; ptr = demo(); //address of a cout
Array is: 0 1 2 3 4 

Здесь мы объявили функцию demo() с типом возвращаемого значения int * (указатель) и в ее определении мы вернули a ( служит как именем массива, так и базовым адресом) на место вызова функции в main() .

Как видно из приведенного выше вывода, функция успешно возвращает массив.

2. Использование структуры в C++

Мы также можем заставить функцию возвращать массив, объявив ее внутри структуры в C++. Давайте посмотрим, как.

#include using namespace std; struct demo < //array declared inside structure int arr[100]; >; struct demo func(int n) //return type is struct demo < struct demo demo_mem; //demo structure member declared for(int i=0;ireturn demo_mem; //address of structure member returned > int main() < struct demo a; int n=5; //number of elements a=func(n); //address of arr coutreturn 0; > 
Array is: 0 1 2 3 4 

Здесь обратите внимание, что мы объявили массив arr внутри структуры demo . И на этот раз функция имеет возвращаемый тип самой структуры и возвращает demo_mem (переменная структуры) вместо массива.

Таким образом, используя другую структурную переменную a , мы можем получить доступ к массиву arr в функции main() .

3. Использование std::array

Для std::array в C++ возврат имени массива из функции фактически означает, что весь массив возвращается на место вызова функции.

#include #include using namespace std; std::array func() //function with return type std::array < std::arrayf_array; //array declared for(int i=0;i <5;i++) < //array initialisation f_array[i] = i; >return f_array; //array returned > int main() < std::arrayarr; //array with length 5 arr=func(); //function call cout return 0; > 
Array is: 0 1 2 3 4 

Следовательно, из вывода видно, что возврат массива функцией func() прошел успешно.

Заключение

Итак, в этом уроке мы узнали о различных методах, с помощью которых мы можем вернуть массив из функции C++.

Если у вас возникнут дополнительные вопросы, не стесняйтесь использовать комментарии ниже.

Рекомендации

  • С++ возвращает массив из функции — вопрос StackOverflow,
  • Двумерный массив в C++ — запись журнала для разработчиков.

Как передать массив в функцию и вернуть его?

Я знаю что во всех почти других языка есть такой тип метода как int[] и я могу вернуть, массив который я передал. Вот есть такой код:

int A[3] = ; int Func(int Array[]) < for(i = 0; i < 3; i++)< Array[i] =+1; >return Array; > 

Как такое сделать?
Отслеживать
23.8k 3 3 золотых знака 46 46 серебряных знаков 61 61 бронзовый знак
задан 22 мая 2016 в 19:40
user211131 user211131
57 1 1 золотой знак 1 1 серебряный знак 2 2 бронзовых знака

Вы бы книжку прочитали. В С++ вместо массивов обычно используется std::vector . Ну или int* , если хочется посложнее.

22 мая 2016 в 19:45
А можете показать пример с указателями ?
22 мая 2016 в 19:47

Int * array; динамическая переменная. Под неё можешь выделить сколько тебе нужно памяти. array = new int[10]. Возвращаешь как обычный указатель.

22 мая 2016 в 20:05
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).
23 мая 2016 в 7:03

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Дело в том что в C++ в функцию можно передать только указатель (или ссылку) на массив, соответственно вы всегда будете работать с исходным массивом, а не с его копией (и вернете также указатель на исходный массив):

int* Func(int *Array) < for(i = 0; i < 3; i++) < Array[i]++; >return Array; > 

Так же этот код не учитывает размер массива (цикл проходит строго три раза), что может привести к следующему:

  • если длина входного массива больше 3: обработаны будут только первые три элемента массива;
  • если длина входного массива меньше 3: программа упадет с грохотом и ошибкой доступа к памяти.

Проблему с размером можно решить двумя путями: передавать в функцию дополнительно размер массива или передавать массив по ссылке (если передавать массив по ссылке, ошибки с тем, что вы передали или вернули массив неправильного размера будут выявлены на стадии компиляции):

int* Func(int* Array, int size) // передача размера, тогда цикл будет for (int i = 0; i < size; i++) int (& Func(int (&Array)[3]))[3] // передача по ссылке, тогда цикл будет for (int i = 0; i < 3; i++) 

В обоих случаях вернется указатель (или ссылка) на исходный массив. Но смысла возвращать что либо из функции в таком случае нет, вы просто можете продолжать использовать старую переменную.

Чтобы вернуть новый массив, придется просто внутри функции выделить память под новый массив и вернуть указатель на нее (главное потом не забыть очистить память):

int* Func(int* Array, int size) < int *new_array = new int[size]; for(int i = 0; i < size; i++) < new_array[i] = Array[i] + 1; >return new_array; > 

Но у нас же C++, черт возьми, так что стоит вместо стандартных сишных массивов воспользоваться теми контейнерами, которые предоставляет Родина STL:

  • std::vector такой "массив" с изменяемым размером;
  • std::array массив фиксированного размера.

Теперь мы можем использовать итераторы, Range-based for loop (начиная с C++11) и прочие прелести:

std::vector Func(std::vector Array) // пример с vector и циклом со счетчиком < for (int i = 0; i < Array.size(); i++) < Array[i]++; >std::array Func(std::array Array) // с array и крутым циклом с итераторами < for (std::array::iterator it = Array.begin(); it < Array.end(); it++) < *i++; >return Array; > 

возврат массива из фу-ии Си

Здравствуйте! Можно ли сделать так на Си: int mas[2]; mas = func(); чтобы функция возвратила массив из двух целых. Если можно, то как описать данную функцию? Зарание спасибо!

anonymous
31.01.06 00:31:27 MSK

Re: возврат массива из фу-ии Си

функции в си не умеет возвращать массивы. открывай учебник и кури главу "указатели"

friday ★★★
( 31.01.06 01:05:15 MSK )

Re: возврат массива из фу-ии Си

можно массив обернуть в структуру. Старый Си не умел возвращать структуры, новый умеет.

dilmah ★★★★★
( 31.01.06 01:20:51 MSK )
Ответ на: Re: возврат массива из фу-ии Си от dilmah 31.01.06 01:20:51 MSK

Re: возврат массива из фу-ии Си

А не проще указатель на память вернуть? Естественно, не на стек функции 🙂

anonymous_incognito ★★★★★
( 01.02.06 01:00:57 MSK )

Re: возврат массива из фу-ии Си

Можно в качестве аргумента указать массив, а он передается как указатель, вот его и использовать.

stassats ★★★★
( 01.02.06 03:39:32 MSK )

Re: возврат массива из фу-ии Си

Может пойдет? Почти похоже. #include int * f()< int a[2]=; int *p=a; return p; > int main()
vikeng
( 01.02.06 09:11:03 MSK )
Ответ на: Re: возврат массива из фу-ии Си от vikeng 01.02.06 09:11:03 MSK

Re: возврат массива из фу-ии Си

А ничего, что f() возвращает адресс локальной переменной?

frenzy
( 01.02.06 10:44:58 MSK )
Ответ на: Re: возврат массива из фу-ии Си от frenzy 01.02.06 10:44:58 MSK

Re: возврат массива из фу-ии Си

Ничего. Программа рабочая, все компилируется и работает.

vikeng
( 01.02.06 18:50:05 MSK )
Ответ на: Re: возврат массива из фу-ии Си от vikeng 01.02.06 18:50:05 MSK

Re: возврат массива из фу-ии Си

vikeng: Нельзя так делать! > Программа рабочая, все компилируется и работает. А ты еще чего-нибудь вызови, она и перестанет работать. Например, попробуй такое у себя прогнать: #include #include int * f()< int a[2]=; int *p=a; return p; > int main()
Die-Hard ★★★★★
( 01.02.06 19:19:39 MSK )
Ответ на: Re: возврат массива из фу-ии Си от vikeng 01.02.06 18:50:05 MSK

Re: возврат массива из фу-ии Си

> Ничего. Программа рабочая, все компилируется и работает.

Ёлки-палки, я в шутку предостерёг от выдачи адреса локальной переменной на стеке, а ты мало того что так сделал, ещё и полагаешь нормальным.

1)Локальная переменная размещается в стеке функции, т.е. в области памяти, закреплённой за функцией _только_ на время её вызова.

2)После возврата управления в вызвавшую функцию область памяти, которую занимала локальная переменная, с большой вероятностью затрёт что-нибудь ещё, она никак не удерживается за переменной.

3)Правильно будет, использовать функцию выделения памяти в куче (malloc, calloc, new, ещё что-нибудь) и работать с ней.

Как вернуть массив из функции c

Начал изучать массивы и указатели в C, и не могу решить проблему, суть которой в том, что функция должна возвращать массив, и она его возвращает, но не в том виде, в котором нужно. Ниже - код и вывод программы

#include int * initArray() < int resultArray[5]; int i; time_t t; for (i = 0; iprintf ("From Init %d\t", resultArray[i]); printf ("\n"); > //Вернется УКАЗАТЕЛЬ НА ПЕРВЫЙ ЭЛЕМЕНТ resultArray[0] return &resultArray; > void outArray (int *out) < int curIndex; for (curIndex = 0; curIndex < 5; curIndex++ ) < printf ("%d\t", (*out) + curIndex ); >> void main (void) < array[5] = initArray(); printf("Первый элемент = %d\n", *array ); printf ("Массив ["); //array - это указатель на первый элемент массива outArray(array); printf ("]\n"); >
From Init 8 From Init 6 From Init 8 From Init 2 From Init 0 From Init 0 Первый элемент = -1218272211 Массив [-1218272211 -1218272210 -1218272209 -1218272208 -1218272207 ]

Вобщем немного запутался с указателями. Заранее спасибо за помощь.
Цифровой кот
Регистрация: 29.08.2014
Сообщений: 7,656

int resultArray[5]; - это статический массив из 5 элементов int. функция возвращает значение указателя на начало этого массива. но косяк в том, что resultArray – локальная переменная, после выхода из области видимости в этих 5 элементах может расположиться любой мусор, но указатель и теперь указывает правильный адрес – тот самый, который функция вернула наружу.

поэтому не надо так делать, это лишний головняк. передавай массивы в функции и из функций по ссылке. если необходимо вернуть новый указатель, выделяй память в функциях динамически и не забывай её возвращать системе обратно за пределами функций, выделяющих память.

з.ы. я художник, я так вижу!

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана.
Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,792
Согласен. Нужно из кучи возвращать:

#include int * initArray(int n) < int *resultArray=malloc(n*sizeof(int)); int i; time_t t; for (i = 0; iprintf ("From Init %d\t", resultArray[i]); printf ("\n"); > return resultArray; > void outArray (int *out,int n) < int curIndex; for (curIndex = 0; curIndex < n; curIndex++ ) < printf ("%d\t", (*out) + curIndex ); >> void main (void) < int *array = initArray(5); printf("Первый элемент = %d\n", array[0] ); printf ("Массив ["); //array - это указатель на первый элемент массива outArray(array,5); free(array); // Или как там освобождать правильно? printf ("]\n"); >

I'm learning to live.
Форумчанин
Регистрация: 07.01.2014
Сообщений: 124

#include #include #include void initArray(int *array, int len) < int i; time_t t; for (i = 0; iprintf ("From Init %d\n", array[i]); > > void outArray (int *out, int len) < int i; for (i = 0; i < len; i++)< printf("\nArray[%d] = %d", i, out[i]); >> int main (void)< const int size = 5; int array[size]; initArray(array, size); printf("first element = %d\n", *array ); //array - это указатель на первый элемент массива outArray(array, size); return 0; >

#define TRUE FALSE //счастливой отладки

Aleksander550
Посмотреть профиль
Найти ещё сообщения от Aleksander550

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *