问题描述
我试图通过将数组传递给函数将数组从一个类复制到另一个类,但是遇到了问题。我要复制的数组似乎丢失了所有数据。
// 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];
}
}
}
我的猜测是它在我通过时发生,但是我不确定自己做错了什么。
解决方法
我的猜测是它在我通过时发生,但是我不确定自己做错了什么。
首先,在嵌套的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
的调用。