C++ C++;通过引用传递动态分配的2D数组

C++ C++;通过引用传递动态分配的2D数组,c++,arrays,reference,multidimensional-array,C++,Arrays,Reference,Multidimensional Array,此问题基于先前提出的问题: 我一直在试图弄清楚如何让我的函数能够很好地处理2d数组引用。我的代码的简化版本是: unsigned int ** initialize_BMP_array(int height, int width) { unsigned int ** bmparray; bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *)); for (in

此问题基于先前提出的问题:

我一直在试图弄清楚如何让我的函数能够很好地处理2d数组引用。我的代码的简化版本是:

    unsigned int ** initialize_BMP_array(int height, int width)
    {
       unsigned int ** bmparray;
       bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *));
       for (int i = 0; i < height; i++)
       {
        bmparray[i] = (unsigned int *)malloc(width * sizeof(unsigned int));
       }
      for(int i = 0; i < height; i++)
        for(int j = 0; j < width; j++)
        {
             bmparray[i][j] = 0;
        }
    return bmparray;
    }
无符号整数**初始化\u BMP\u数组(整数高度、整数宽度)
{
无符号整数**bmparray;
bmparray=(无符号整数**)malloc(高度*sizeof(无符号整数*);
对于(int i=0;i

< >我不知道如何重新编写这个函数,这样我就可以在BMPARLY中作为一个空的无符号int **,这样我就可以在一个函数中分配数组的空间,并将值设置在另一个.< /p> 中,使用更安全、更现代的C++习语,您应该使用向量,而不是动态分配的数组

typedef array_type unsigned int **;
initialize_BMP_array(array_type& bmparray, int height, int width)
void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width);
void初始化\u BMP\u数组(向量和bmparray、整数高度、整数宽度);

嗯。。。也许我不太理解你的问题,但在C中,你可以通过传递另一个指针间接层来传递“通过引用”。即,指向双指针bmparray本身的指针:

unsigned int ** initialize_BMP_array(int height, int width, unsigned int *** bmparray)
{
   /* Note the first asterisk */
   *bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *));

   ...

   the rest is the same but with a level of indirection


   return *bmparray;
}
因此bmparray的内存保留在函数中(然后通过引用传递)


希望这有帮助。

使用类包装它,然后通过引用传递对象

class BMP_array
{
public:
    BMP_array(int height, int width)
    : buffer(NULL)
    {
       buffer = (unsigned int **)malloc(height * sizeof(unsigned int *));
       for (int i = 0; i < height; i++)
       {
        buffer[i] = (unsigned int *)malloc(width * sizeof(unsigned int));
       }

    }

    ~BMP_array()
    {
        // TODO: free() each buffer
    }

    unsigned int ** data()
    {
        return buffer;
    }

private:
// TODO: Hide or implement copy constructor and operator=
unsigned int ** buffer
};
类BMP\u数组
{
公众:
BMP_数组(整数高度、整数宽度)
:缓冲区(空)
{
缓冲区=(无符号整数**)malloc(高度*sizeof(无符号整数*);
对于(int i=0;i
这看起来像是许多锅炉板只是为了通过阵列。如果他只处理原始数据,为什么要将其封装在一个类中?这取决于对数据进行了多少不同的操作,但我的观点是,即使只是初始化操作和内存管理,也值得使用一个类。我同意。我不可能在不包装资源的情况下分配资源。是的,但这不是问题所在。问题是句法——如何传递数组。这与是否应该传递数组不同。我可以想象你想要传递一个原始数组的情况。如果我有一个函数,我使用malloc和指针分配一些内存,实际上我是在扩展一个数组。现在我必须使用return传递相同的数组。现在我甚至不能在返回之前释放它。在这种情况下我能做什么?必须编写这两个函数,以便接收分配数组的函数在返回后释放它。也就是说,接收分配值的函数必须知道它必须释放该值。