如何从函数返回动态分配的指针数组?

时间:2012-02-16 15:32:56

标签: c++ arrays pointers dynamic

我现在正在课堂上开始动态内存分配并对它有一个正确的理解,但不能完全正确使用它。我觉得我的指针可能不是很好:p

我的讲师给出了创建名为readArray的函数的说明,该函数将提示用户输入一个数字作为动态创建该大小的整数数组的大小。然后我将新数组分配给指针。然后我应该提示用户填充数组。然后我应该返回新创建的数组和大小。

我无法弄清楚如何返回数组,我想在动态分配内存时你应该在使用后删除分配以防止泄漏。

必须将数组和大小返回到main,以便将其传递给其他函数,例如排序函数。

我非常感谢能得到的任何帮助,因为我的思维过程一直朝着错误的方向发展。

#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 个答案:

答案 0 :(得分:6)

如果您使用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;
}

答案 1 :(得分:5)

要返回数组:将readArray()声明为int* readArray() [返回int*而不是int],然后返回arrPTR而不是{{1} }}。这样,您将返回size指向的动态分配数组。

关于删除:当你完成使用数组时,你应该删除它。在您的示例中,请在arrPTR函数中的return 0之前执行此操作。
确保自从您使用main()分配内存后,您还应该使用delete[]释放内存,否则 - 您的程序将发生内存泄漏。

答案 2 :(得分:1)

就像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,只需指定即可。