我正在创建“船舶”游戏。我生成mField,这将是我的模板,用舰船填充敌方领域。为此,我想将mField复制到eField中。
我的mField是结构“字段”的动态2D数组,它像这样填充在我的cpp文件中:
mField = new Field*[x+3];
for (int i = 0; i < x+3; ++i)
mField[i] = new Field[y+3];
并在我的头文件中这样声明
Field **mField;
现在尝试复制了
memcpy(&eField, &mField, sizeof(&mField));
尽管现在当我用舰船填充我的mField时,我在敌方领域看到了mField的确切副本,而不是干净的领域。 这就是我将字段传递给可更改字段的函数的方式:
void Map::changeField(int x, int y, string ciag,Field **field) {
...
}
我是否在函数中犯了一个错误,即它同时更改了两个数组,或者我以错误的方式复制了数组?
答案 0 :(得分:1)
您正在敌人区域中复制指向您自己区域的指针,这将不起作用,您正在共享这些区域。
使用std::vector<Filed>((x+3)*(y+3))
,即!D字段数组,并以2D形式访问它。
如果需要使用2D数组,请像以前一样为每行再次分配新字段(提示:创建一个以通用方式创建mField和eField的函数)。
答案 1 :(得分:0)
memcpy
只需将指针复制到您的基础数组中。它没有复制指针指向的 内容 。
您的复制功能必须分配新的内存并复制内容(也称为深度复制):
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);
}