尝试将对象的二维数组复制到另一个函数

时间:2020-09-30 22:22:42

标签: c++ arrays pointers multidimensional-array

我试图通过将数组传递给函数将数组从一个类复制到另一个类,但是遇到了问题。我要复制的数组似乎丢失了所有数据。

// A.h

class A
public:
virtual void Test();
private:
A* array2D[30][32];

// A.cpp

void A::Test()
{
    B* f = new B();
    f->pass(array2D);
}   
// B.h

class A;
class B
{
public:
void pass(A *a[][32]);

private: 
A *a[30][32];
}
// B.cpp

void B::pass(A *array2D[][32])
{
    for (int i = 0; i <= 30; i++)
    {

        for (int j = 0; j <= 32; j++)
        {
            a[i][j] = array2D[i][j];

        }

    }
}

我的猜测是它在我通过时发生,但是我不确定自己做错了什么。

1 个答案:

答案 0 :(得分:0)

我的猜测是它在我通过时发生,但是我不确定自己做错了什么。

首先,在嵌套的for循环的最后一次迭代中,您的for循环会超出数组的范围:

void B::pass(A *array2D[][32])
{
    for (int i = 0; i <= 30; i++)  // This goes out-of-bounds on the last iteration
    {
       for (int j = 0; j <= 32; j++)  // This also goes out-of-bounds.
        {
            a[i][j] = array2D[i][j];
        }
    }
}

<=循环中使用for表示可能会出错,并且代码也会出错。解决方法是:

void B::pass(A *array2D[][32])
{
    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 32; j++)
        {
            a[i][j] = array2D[i][j];
        }
    }
}

这将起作用,但是它效率低下(除非出色的优化编译器认为这效率低下并更改代码)。


更好的方法是对std::copy的简单调用:

#include <algorithm>

void B::pass(A *array2D[][32])
{
    std::copy(&array2D[0][0], &array2D[29][32], &a[0][0]);
}

之所以可行,是因为C ++中的二维数组在连续内存中具有其数据布局,因此它本质上是一维数组。因此,只需给出数组元素的开始和结束地址即可。

编译器很有可能会看到您正在复制一个平凡可复制的类型(指针),因此对std::copy的调用会导致对memcpy的调用。