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

sir*_*isp 1 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;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Vyktor:C++ 11编译器会通过移动它来返回向量; 一个体面的C++ 03编译器将忽略该副本. (4认同)
  • 这就是教授C++课程的方式.尽管C++上的大多数类可能很早就覆盖了像这样的原始数组,但这是一个错误.应该教初学者使用向量,处理原始数组和手动动态分配作为高级主题.Bjarne Stroustrup的初学者的书[_Programming-Principals and Practice Using C++ _](http://www2.research.att.com~bs/programming.html)正确地做到了这一点. (4认同)
  • 这将是一个完美的解决方案,但似乎他们现在应该研究"new"运算符使用,提及向量(和其他容器)可能会令人困惑.恕我直言. (2认同)
  • @ bames53:我不同意.在大学里,教授基础知识c ++的目标不仅仅是"正确使用c ++".这些课程的目标之一也是学生将理解内存分配[自动/动态],参考变量和值变量之间的差异,内存布局,......理解这些概念通常需要动态数组分配的一些脏工作并使用指针[指向指针...] (2认同)

ami*_*mit 5

要返回一个数组:声明readArray()int* readArray()[return an int*而不是int],并返回arrPTR而不是size.这样,您返回arrPTR指向的动态分配的数组.

关于删除:当你完成使用数组时,你应该删除它.在您的示例中,请return 0main()函数之前执行此操作.
确保自从你分配了内存以来new[],你也应该释放它delete[],否则 - 你的程序会有内存泄漏.

  • @Vyktor:这是作业,我只给他提示如何做,如果我做你的建议,他就不会从中学习. (2认同)