Как я могу вернуть указатель на массив в C ++? - PullRequest
0 голосов
/ 25 декабря 2011

Вот мой простой код: arrayfunc () должен хранить некоторые числа в массиве и возвращать указатель этого массива в основную функцию, где будет выводиться содержимое массива. В чем проблема с моим кодом?Он возвращает только указатель на первый элемент массива. Любая помощь приветствуется.Заранее спасибо.


   #include <iostream>

   using namespace std;

   //The definition of the function should remain the same
   int* arrayfunc()
   {
    int *array[10];
    array[0] =new int;
    array[1] =new int;
    array[2] =new int;
    array[3] =new int;

    *array[0]=10;
    *array[1]=11;
    *array[2]=12;
    *array[3]=13;

    return  *array;

   }

   int main()
   {


    for(int i=0;i<4;i++)
    cout<<*(arrayfunc()+i)<<endl; 

     return 0;
   }

Ответы [ 5 ]

3 голосов
/ 25 декабря 2011

(1) Вы должны выделить свой массив с new, если хотите его вернуть: int* array = new int[10]; [при условии, что здесь вы хотите массив int с, а не массив int* ']
(2) чтобы вернуть указатель на первый элемент в массиве, используйте return array, а не return *array
(3) ваш массив - это массив указателей, а не массив целых чисел.

1 голос
/ 25 декабря 2011

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

Но вы этого не делаете, вы просто возвращаете действительное (копию) значение 0-го элемента массива.

Итак, что вы должны сделать:

  1. Лучшей идеей было бы переключиться на контейнеры stl. Вы должны использовать std :: vector или что-то в этом роде.
  2. Если вы придерживаетесь идеи ручного управления памятью, вы должны выделить массив в куче, вернуть его из функции и, возможно, освободить его в вызывающей программе.

Edit:
в основном вы хотите следующее:

using namespace std;

vector<int> arrayfunc()
{
    vector<int> v;
    v.push_back(10);
    ...
    return v;
}

...

vector<int> result = arrayfunc();
cout << result[0] << ...

Это был бы правильный путь C ++.

(Nitpicking :) Вам не нужно заботиться о копировании вектора, потому что RVO используется всеми современными компиляторами C ++.


Выделение массива в куче также должно быть простым:

int* array = new int[4];
array[0] = 10;
...
return array;

...
int* array = arrayfunc();
...
delete[] array;

Но я бы настоятельно рекомендовал использовать прежний подход (с вектором).

0 голосов
/ 25 декабря 2011

Просто попробуйте return array; вместо return *array;

0 голосов
/ 25 декабря 2011
0 голосов
/ 25 декабря 2011

Этот код кажется мне неправильным на нескольких уровнях.

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

  2. Почему вы присваиваете каждому int один новый?Я бы выделил весь массив сразу.Если вы знаете длину массива и его константу, рассмотрите возможность его статического определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...