C++通过引用传递动态分配的二维数组

3

这个问题是在之前一个问题的基础上提出的:如何传递已知大小的多维数组的引用

我一直在试图弄清楚如何让我的函数与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;
    }

我不知道如何重写这个函数,使得当我将bmparray作为一个空的unsigned int **传递进来时,它能够工作,以便我可以在一个函数中分配数组的空间,在另一个函数中设置值。

4个回答

3
typedef array_type unsigned int **;
initialize_BMP_array(array_type& bmparray, int height, int width)

3

使用一个类来封装它,然后通过引用传递对象

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
};

这似乎是很多样板文件,只是为了传递一个数组。如果他只使用原始数据,为什么要将其包装在类中? - BigSandwich
这取决于对数据进行了多少不同的操作,但我的观点是,即使仅针对初始化操作和内存管理,使用类也是值得的。 - jturcotte
我同意。我绝不会在没有进行任何包装的情况下分配资源。 - Rob K
是的,但那不是问题所在。问题是语法上的——如何传递一个数组。这与是否应该传递一个数组不同。我可以想到一些情况下你会想要传递一个原始数组。 - BigSandwich

2

嗯...也许我没有很好地理解你的问题,但是在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的内存是在函数内部分配的(然后通过引用传递)。

希望这可以帮助你。


如果我有一个函数,我使用malloc和指针分配了一些内存,实际上我正在扩展一个数组。现在我必须使用返回值传递相同的数组。在返回之前,我甚至不能释放它。在这种情况下我该怎么办? - Optimus Prime
你需要编写两个函数,以便接收分配的数组的函数在使用后释放它。也就是说,接收分配值的函数必须知道它必须释放它。 - Diego Sevilla

1
为了使用更安全和现代的C++语法,您应该使用向量而不是动态分配数组。
void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接