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

Posted

技术标签:

【中文标题】C++:使用函数为二维数组分配内存时出错【英文标题】:C++: Error while allocating memory for a two dimensional array using functions 【发布时间】:2016-08-01 17:36:37 【问题描述】:

我试图理解按引用传递和按值传递。在这个程序中,我有一个二维数组,它在 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;
       
    

【问题讨论】:

使用std::vector&lt;std::vector&lt;int&gt;&gt;为自己节省大量时间和精力。 我正在一步一步地学习 C++。从我的在线搜索中,我了解到 STL 可以解决很多内存问题。但是我还没有学过 STL,所以我想在继续前进之前确保我清楚地理解了指针。 【参考方案1】:

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

添加

*locArray = temp;

到最后allocate2DArrayPtr 会解决问题。

【讨论】:

没问题。很高兴为您提供帮助。【参考方案2】:

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

int **&temp = *locArray;

【讨论】:

以上是关于C++:使用函数为二维数组分配内存时出错的主要内容,如果未能解决你的问题,请参考以下文章

c++ 二维数组内存分配

如何在 C++ 中为二维对象数组分配内存? [复制]

需要有关 C++ 中二维数组的动态内存分配的帮助

C++二维数组内存分配

c++中二维数组的内存分配

在 C++ 中使用动态内存分配创建二维数组