C++ 复制结构c+的二维数组+;

C++ 复制结构c+的二维数组+;,c++,arrays,multidimensional-array,struct,C++,Arrays,Multidimensional Array,Struct,我正在制作“飞船”游戏。我生成mField,这将是我的模板,以填补敌人的领域与船舶。为此,我要将mField复制到eField My mField是结构“Field”的动态2D数组,在我的cpp文件中是这样填充的: mField = new Field*[x+3]; for (int i = 0; i < x+3; ++i) mField[i] = new Field[y+3]; 现在我试着复制 memcpy(&eField, &mField, s

我正在制作“飞船”游戏。我生成mField,这将是我的模板,以填补敌人的领域与船舶。为此,我要将mField复制到eField

My mField是结构“Field”的动态2D数组,在我的cpp文件中是这样填充的:

mField = new Field*[x+3];
    for (int i = 0; i < x+3; ++i)
        mField[i] = new Field[y+3];
现在我试着复制

memcpy(&eField, &mField, sizeof(&mField));
虽然现在当我用战舰填满战场时,我在敌人的战场上看到了战场的精确副本,而不是干净的战场。 这就是我将字段传递给更改字段的函数的方式:

void Map::changeField(int x, int y, string ciag,Field **field) {
    ...
}

我在函数中是否犯了一些错误,即它更改了两个数组,或者我以错误的方式复制了数组?

您正在将敌方字段指针复制到您自己的字段,这不起作用,您正在共享字段

使用一个
std::vector((x+3)*(y+3))
,所以一个!D字段数组,并将其作为2D访问


如果需要使用2D数组,请像以前一样为每行重新分配新字段(提示:创建一个函数,以通用方式创建mField和eField)。

memcpy
只需将指针复制到基础数组即可。它没有复制指针指向的内容

您的复制功能必须分配新内存并复制内容(也称为深度复制):

eField=新字段*[x+3];
对于(int i=0;i
eField和mField应该是这样一个向量。然后在与两个字段之一交互时传递向量。除了内存安全之外,这也显式地不在两个字段之间共享对象。你的教授不是很聪明。。。现代C++不是用来处理内存的。无论如何,然后分配一个大的字段数组,而不是为每个字段分配一个二维数组。然后添加一个显式的删除来删除每个数组。@ MatthuBruuri,我同意你对现代C++所说的,因为在生产代码中有工具和技术来处理这个问题,但是当涉及到课程时,我可以理解教授或老师来自哪里。它仍然是语言的一个有效部分,他们正在努力教他们基础知识,以便他们能够学习和了解它们是什么,如何正确使用它们,它们的优点和缺点,以及如何避免潜在的内存泄漏、无效指针、悬空指针和引用等。@FrancisCugler教授C风格数组是不好的。他们不是合适的类型。如果你要教“低级”的东西,
std::allocator
std::aligned_storage
和/或placement new都要好得多。@Francis我的意思是使用数组/向量比正确使用[]的代码要少。而且做不正确的事情更难,因为某些原因,它仍然不起作用。我甚至添加了第三个数组hField,当我绘制它时,它是mField的精确副本。这是因为
memcpy(efield[I],mField[I],y+3)
错误,这不会将mField的内容复制到eFild,而只复制第一个
y+3
字节。
void Map::changeField(int x, int y, string ciag,Field **field) {
    ...
}
eField = new Field*[x+3];
for (int i = 0; i < x+3; ++i)
{
    eField[i] = new Field[y+3];
    memcpy(efield[i], mField[i], y+3);
}