C++ 使用memcpy复制二维阵列?

C++ 使用memcpy复制二维阵列?,c++,arrays,memcpy,C++,Arrays,Memcpy,所以我想把一个2D数组的内容复制到另一个完全相同类型的数组中。以下是创建阵列的方式: GridUnit** newGrid; newGrid = new GridUnit*[width]; for (int i = 0; i < width; i++) newGrid[i] = new GridUnit[height]; “网格”在大小和类型上与“新网格”相同。然而,这是行不通的。我知道memcpy可能不正确,但是使用它尝试了多个不同的设置,我不知道它出了什么

所以我想把一个2D数组的内容复制到另一个完全相同类型的数组中。以下是创建阵列的方式:

 GridUnit** newGrid;
 newGrid = new GridUnit*[width];
    for (int i = 0; i < width; i++)
        newGrid[i] = new GridUnit[height];

“网格”在大小和类型上与“新网格”相同。然而,这是行不通的。我知道memcpy可能不正确,但是使用它尝试了多个不同的设置,我不知道它出了什么问题,所以欢迎任何帮助

如果您实际上有一个二维数组,那么
memcpy
调用就可以了。但是你没有,你有
width
独立的不连续的一维数组,收集在指针数组中

可以在运行时动态分配行数和列数都不同的连续块,并保留两个下标访问。您必须按如下方式更改分配代码:

GridUnit** newGrid;
newGrid = new GridUnit*[width];
newGrid[0] = new GridUnit[width * height];
for (int i = 1; i < width; i++)
    newGrid[i] = newGrid[i-1] + height;
对于
newGrid[i]
i>0
没有
delete[]
,因为它们没有自己的块,它们只是指向单个大块。由于所有内容都是连续的,因此可以将
newGrid[0]
视为指向第一行(
height
elements)或整个二维数组(
width*height
elements)的指针

然后,您可以将所有数据作为单个连续块进行访问:

memcpy(newGrid[0], oldGrid[0], height * width * sizeof newGrid[0][0]);

当然,不应该使用原始指针来拥有内存。智能指针将确保即使在异常流量控制的情况下也能正确删除内存。它看起来是这样的:

std::unique_ptr<GridUnit[]> newData;
std::unique_ptr<GridUnit*[]> newGrid;
// before C++14 use // newData.reset(new GridUnit[width * height]);
newData = std::make_unique<GridUnit[]>(width * height);
// before C++14 use // newGrid.reset(new GridUnit*[width]);
newGrid = std::make_unique<GridUnit*[]>(width);
for (int i = 0; i < width; i++)
    newGrid[i] = &newData[i * height];
std::unique_ptr newData;
std::unique_ptr newGrid;
//在C++14之前,使用//newData.reset(newgridunit[width*height]);
newData=std::使_唯一(宽度*高度);
//在C++14之前,使用//newGrid.reset(newgridunit*[width]);
newGrid=std::使_唯一(宽度);
对于(int i=0;i
哦,天哪。请使用向量,它就行了<代码>vec1=vec2是的,它会让我的生活变得更容易,只是碰巧我没有决定使用这样的数组,现在它们都在代码基础上使用。我会认真考虑重写它。向量有很多优点,比如在好的调试编译器上进行边界检查。哦,当然,我不相信我没有意识到这一点。这很有道理,为什么它现在不起作用。但是,如果我仍然想使用此阵列设置,我看不到比使用for循环更高的分辨率?如果高度是常量,则可以这样做,即使用新的。但这是真的吗?@KieronH了解更多信息information@KieronH:我用了一种你可能会觉得有用的方法编辑。哇,谢谢!这正是我要找的!
memcpy(newGrid[0], oldGrid[0], height * width * sizeof newGrid[0][0]);
std::unique_ptr<GridUnit[]> newData;
std::unique_ptr<GridUnit*[]> newGrid;
// before C++14 use // newData.reset(new GridUnit[width * height]);
newData = std::make_unique<GridUnit[]>(width * height);
// before C++14 use // newGrid.reset(new GridUnit*[width]);
newGrid = std::make_unique<GridUnit*[]>(width);
for (int i = 0; i < width; i++)
    newGrid[i] = &newData[i * height];