【问题标题】:C++ Passing a dynamicly allocated 2D array by referenceC ++通过引用传递动态分配的二维数组
【发布时间】:2010-10-06 12:06:10
【问题描述】:

这个问题建立在之前提出的问题之上: Pass by reference multidimensional array with known size

我一直在试图弄清楚如何让我的函数与 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 ** 传递的情况下工作,以便我可以在一个函数中为数组分配空间,并且在另一个中设置值。

【问题讨论】:

    标签: c++ arrays reference multidimensional-array


    【解决方案1】:
    typedef array_type unsigned int **;
    initialize_BMP_array(array_type& bmparray, int height, int width)
    

    【讨论】:

      【解决方案2】:

      要使用更安全、更现代的 C++ 习语,您应该使用向量而不是动态分配的数组。

      void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width);
      

      【讨论】:

        【解决方案3】:

        嗯...也许我不太理解您的问题,但是在 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 和指针分配一些内存,实际上我正在扩展一个数组。现在我必须使用 return 传递相同的数组。现在我什至无法在返回之前释放它。在这种情况下我该怎么办?
        • 您必须编写这两个函数,以便接收分配数组的函数随后释放它。也就是说,接收分配值的函数必须知道它必须释放它。
        【解决方案4】:

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

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

        【讨论】:

        • 这看起来像很多样板,只是为了传递一个数组。如果他只使用原始数据,为什么要将其包装在一个类中?
        • 这取决于对数据进行了多少不同的操作,但我的看法是,即使只是初始化操作和内存管理,也值得使用一个类。
        • 我同意。如果不以某种方式包装它,我就无法分配资源。
        • 是的,但这不是问题所在。问题是语法上的——如何传递一个数组。这与是否应该传递数组不同。我可以想到您想要传递原始数组的情况。
        猜你喜欢
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        相关资源
        最近更新 更多