c++ - 使用 memcpy 复制二维数组?

标签 c++ arrays memcpy

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

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

GridUnit 的大小为 16(4 个 float )。所以这一切都初始化好了,在我运行 for 循环以实际用一些数据填充值之后使用它没有问题。现在我想要做的是将另一个数组的内容复制到这个数组中(如果可能的话没有 for 循环)。到目前为止,这是我一直在尝试做的事情:

 memcpy(&newGrid, &grid, height * width * 16);

'grid' 在大小和类型方面与 'newGrid' 相同。但是,这不起作用。我知道 memcpy 可能不正确,但是使用它尝试了多种不同的设置后,我不知道它出了什么问题,所以欢迎任何帮助!

最佳答案

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

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

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

然后您可以将所有数据作为一个连续的 block 进行访问:

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

关于c++ - 使用 memcpy 复制二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375797/

相关文章:

c - 函数 fscanf 忽略 .txt 文件中的空格分隔符

c++ - 取决于模板参数的函数名称解析

c++ - 将数字 vector 从基数转换为基数

c++ - 在编译时推导二维数组的一维

c# - 使用 Singleton 的动态长度数组

arrays - 如何修复 JSON 解析应用程序中的 'Index Out Of Range' 错误

相同地址的C结构分配有效吗?

c - 如何使用 memcpy 将指针复制到数组元素

c++使用匿名对象调用函数导致编译器错误

c++ - Xcode C++ : Build in Debug but not Release