使用memcpy复制2D数组?

时间:2015-03-31 18:26:29

标签: c++ arrays memcpy

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

 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);

&#39;网格&#39;与'newGrid&#39;相同就其大小和类型而言。但是,这不起作用。我知道memcpy可能不正确,但是尝试了多种不同的设置,我不知道它出了什么问题,所以任何帮助都会受到欢迎!

1 个答案:

答案 0 :(得分:30)

如果你实际上有一个二维数组,memcpy调用将起作用。但是你没有,你有width个不连续的1-D数组,收集在一个指针数组中。

可以动态分配一个连续的块,其中行和列计数在运行时都会发生变化,并保留双下标访问。您必须按如下方式更改分配代码:

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[]newGrid[i]没有i > 0,因为它们没有自己的块,只是指向单个大块。因为所有内容都是连续的,所以您可以将newGrid[0]视为指向第一行(height元素)或整个2-D数组(width * height元素)的指针。

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

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

当然,不应该使用原始指针来获取内存所有权。即使使用特殊的流量控制,智能指针也可确保正确删除内存。它看起来像这样:

std::unique_ptr<GridUnit[]> newData;
std::unique_ptr<GridUnit*[]> newGrid;
newData.reset(new GridUnit[width * height]);
// or newData = std::make_unique<GridUnit[]>(width * height);
newGrid.reset(new GridUnit*[width]);
// or newGrid = std::make_unique<GridUnit*[]>(width);
for (int i = 0; i < width; i++)
    newGrid[i] = &newData[i * height];