C++ 尝试将二维对象数组复制到另一个函数
我试图通过将数组传递给函数将数组从一个类复制到另一个类,但遇到了一些问题。我试图复制的数组似乎丢失了所有数据C++ 尝试将二维对象数组复制到另一个函数,c++,arrays,pointers,multidimensional-array,C++,Arrays,Pointers,Multidimensional Array,我试图通过将数组传递给函数将数组从一个类复制到另一个类,但遇到了一些问题。我试图复制的数组似乎丢失了所有数据 // A.h class A public: virtual void Test(); private: A* array2D[30][32]; //B.cpp 无效B::通过(A*array2D[][32]) { 对于(int i=0;i 我的猜测是,当我通过它时,它正在发生,但我不确定我做错了什么 首先,用于填充数组的for循环在嵌套的for循环的最后一次迭代中超出边界: vo
// A.h
class A
public:
virtual void Test();
private:
A* array2D[30][32];
//B.cpp
无效B::通过(A*array2D[][32])
{
对于(int i=0;i
我的猜测是,当我通过它时,它正在发生,但我不确定我做错了什么
首先,用于填充数组的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];
}
}
}
这将是可行的,但是效率很低(除非一个优秀的优化编译器发现这是低效的并更改了代码)
更好的方法是调用std::copy
:
#include <algorithm>
void B::pass(A *array2D[][32])
{
std::copy(&array2D[0][0], &array2D[29][32], &a[0][0]);
}
#包括
无效B::通过(A*array2D[][32])
{
std::copy(&array2D[0][0]、&array2D[29][32]、&a[0][0]);
}
这是因为C++中的二维数组在邻接内存中有数据布局,因此本质上是一维数组,所以需要数组元素的起始地址和结束地址。
编译器很可能会看到您正在复制一个微不足道的可复制类型(指针),因此对std::copy
的调用会导致对memcpy
A*array2D[30][32];
--一个二维指针数组?这真的是目的吗?A[i][j]=A[i][j]
这似乎很奇怪哦,我想说的是一个对象数组,让我来修正一下,对不起,我打字太快了,把我想要描述的东西弄糟了。对不起,我想这会慢慢变成一个。首先,2D数组复制可以在一行代码中完成,使用std::copy
并提供正确的参数——不需要一个嵌套的for
循环。但正如@anastaciu所指出的,您在这里的真正意图是什么?是复制对象,而不是指针?
// 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];
}
}
}
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];
}
}
}
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];
}
}
}
#include <algorithm>
void B::pass(A *array2D[][32])
{
std::copy(&array2D[0][0], &array2D[29][32], &a[0][0]);
}