Как вернуть динамически распределенный массив указателей из функции? - PullRequest
1 голос
/ 16 февраля 2012

Я сейчас запускаю динамическое выделение памяти в классе и хорошо понимаю его, но не могу полностью использовать его должным образом.Я чувствую, что с указателями у меня тоже не все получается: p

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

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

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

#include <iostream>
using namespace std;

int* readArray(int&);
void sortArray(int *, const int * );

int main ()
{
   int size = 0;
   int *arrPTR = readArray(size);
   const int *sizePTR = &size;
   sortArray(arrPTR, sizePTR);

   cout<<arrPTR[1]<<arrPTR[2]<<arrPTR[3]<<arrPTR[4];

        system("pause");
        return 0;
}


int* readArray(int &size)
{
   cout<<"Enter a number for size of array.\n";
   cin>>size;
   arrPTR = new int[size];

   for(int count = 0; count < (size-1); count++)
   {    
       cout<<"Enter positive numbers to completely fill the array.\n";
       cin>>*(arrPTR+count);
   }

   return arrPTR;
}

Ответы [ 3 ]

6 голосов
/ 16 февраля 2012

Вам не нужно будет делать это, если вы используете std::vector<int>, что намного лучше.

Используйте это:

std::vector<int> readArray()
{
    int size = 0;
    cout<<"Enter a number for size of array.\n";
    cin >> size;
    std::vector<int> v(size);

    cout<<"Enter "<< size <<" positive numbers to completely fill the array : ";
    for(int i = 0; i < size; i++)
    {   
        cin>> v[i];
    }
    return v;
}
5 голосов
/ 16 февраля 2012

Чтобы вернуть массив: объявите readArray() как int* readArray() [верните int* вместо int] и верните arrPTR вместо size. Таким образом, вы возвращаете динамически размещенный массив, на который указывает arrPTR.

Относительно удаления: Когда вы закончите использовать массив, вы действительно должны удалить его. В вашем примере, сделайте это до return 0 в вашей функции main().
Убедитесь, что, поскольку вы выделили память с помощью new[], вы также должны освободить ее с помощью delete[], иначе - ваша программа будет иметь утечку памяти.

1 голос
/ 16 февраля 2012

Как говорит amit, вы, вероятно, должны вернуть массив вместо размера.Но так как вам все еще нужен размер, измените readArray следующим образом:

///return array (must be deleted after)
///and pass size by reference so it can be changed by the function
int* readArray(int &size);

и назовите его так:

int size = 0;
int *arrPTR = readArray(size);
///....Do stuff here with arrPTR
delete arrPTR[];

После обновления:

int* readArray(int size); ///input only! need the & in the declaration to match
                          ///the function body!

Неправильно, поскольку у вас есть фактическое определение с int &size.Вы также не объявляете arrPTR в readArray, просто назначьте его.

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