C ++:使用函数为二维数组分配内存时出错

时间:2016-08-01 17:36:37

标签: c++ arrays pointers memory-management

我试图理解通过引用传递和传递值。在这个程序中,我有一个二维数组,在main中声明,其大小在函数中分配。在allocate2DArrayRef()函数中,我获得了两个大小并动态分配和初始化数组Array2D。

现在我试图通过指针了解如何做同样的事情。我已经编写了另一个函数allocate2DArrayPtr(),其中我传递指向二维数组的指针,获取大小的值 - sizeX和sizeY,然后将内存分配给变量secArray2D。

当我运行程序时,当我尝试打印出secArray2D时,它会挂起。我假设这意味着函数allocate2DArrayPtr()没有成功地将内存动态分配给数组secArray2D。

我的最终目标是编写一个程序,该程序具有动态分配内存的功能,并初始化从输入文件中读取的各种维度的多个数组。我知道我可以通过引用函数allocate2DArrayRef()来扩展,以实现我的目标。但我很好奇为什么我的函数allocate2DArrayPtr()不起作用,因为我想明确如何通过指针传递。我知道如何更改allocate2DArrayPtr()以返回指针,但我想将数组作为参数传递。

我正在使用Codeblocks 13.12 IDE在Windows 7上运行该程序。

#include <iostream>
using namespace std;

void allocate2DArrayRef(int **&, int &, int &);
void allocate2DArrayPtr(int ***, int *, int *);

int main()
{
   int sizeX, sizeY;
   int **Array2D;
   allocate2DArrayRef(Array2D, sizeX, sizeY);
   for(int i=0; i< sizeX; i++)
   {
      for(int j=0; j< sizeY; j++)
      {
         cout << "Array2D[" << i << "][" << j << "]:" << Array2D[i][j] <<     endl;
      }
   }
   cout << endl << endl;
   int **secArray2D;
   allocate2DArrayPtr(&secArray2D, &sizeX, &sizeY);

   for(int i=0; i<sizeX; i++)
   {
      for(int j=0; j<sizeY; j++)
      {
         cout << "secArray2D[" << i << "][" << j << "]:" << secArray2D[i][j] << endl;
      }
   }

   return 0;
}

void allocate2DArrayRef(int **&locArray, int& indexFirst, int& indexSecond)
{
    indexFirst = 4;
    indexSecond = 5;
    locArray = new int*[indexFirst];
    for(int i=0; i<indexFirst ; i++)
    { 
        locArray[i] = new int[indexSecond];
        for(int j=0; j<indexSecond; j++)
        {
            locArray[i][j] = i*j;
        }
    }
}

void allocate2DArrayPtr(int ***locArray, int *indexFirst, int *indexSecond)
{
   *indexFirst = 2;
   *indexSecond = 3;
    int **temp = *locArray;
    temp = new int*[*indexFirst];
    for(int i=0; i<(*indexFirst) ; i++)
    {
       temp[i] = new int[*indexSecond];
       for(int j=0; j<(*indexSecond); j++)
       {
           temp[i][j] = i+j;
       }
    }
}

2 个答案:

答案 0 :(得分:0)

allocate2DArrayPtr不起作用的原因是您从未将locArray设置为指向您在函数中创建的数组。这意味着当您从函数secArray2D返回时仍然未初始化。

添加

*locArray = temp;

allocate2DArrayPtr结尾将解决问题。

答案 1 :(得分:0)

或者你可以像这样引用你的临时工具:

int **&temp = *locArray;