所以我想将二维数组的内容复制到另一个完全相同类型的数组。以下是数组的创建方式:
GridUnit** newGrid;
newGrid = new GridUnit*[width];
for (int i = 0; i < width; i++)
newGrid[i] = new GridUnit[height];
GridUnit 的大小为 16(4 个浮点数)。所以这一切都初始化得很好,使用它没有问题,因为在我运行 for 循环以实际用一些数据填充值之后。现在我想做的是将另一个数组的内容复制到这个数组中(如果可能的话,不要使用 for 循环)。到目前为止,这就是我一直在尝试做的事情:
memcpy(&newGrid, &grid, height * width * 16);
“grid”在大小和类型方面与“newGrid”相同。然而,这是行不通的。我知道 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;
解除分配变得更简单:
delete[] newGrid[0];
delete[] newGrid;
没有delete[]
for newGrid[i]
with i > 0
因为它们没有自己的块,所以它们只是指向单个大块。因为一切都是连续的,所以你可以想到newGrid[0]
作为指向第一行的指针(height
元素),或整个二维数组(width * height
元素)。
然后您可以将所有数据作为单个连续块进行访问:
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];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)