【问题标题】:Copy 2D array using memcpy?使用 memcpy 复制二维数组?
【发布时间】:2015-06-05 05:09:33
【问题描述】:

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

 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 可能不正确,但是使用它尝试了多种不同的设置,我不知道它出了什么问题,所以欢迎任何帮助!

【问题讨论】:

  • 天哪。请只使用向量,它会正常工作vec1 = vec2;
  • 是的,它会让我的生活变得更轻松,只是碰巧我没有决定使用这样的数组,而现在它们被用于整个代码库。
  • 我会认真考虑重写它。向量有很多优点,例如在良好的调试编译器上进行边界检查。

标签: c++ arrays memcpy


【解决方案1】:

如果你真的有一个二维数组,那么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;

newGrid[i]i &gt; 0 没有 delete[],因为它们没有自己的块,它们只是指向单个大块。因为一切都是连续的,您可以将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];

【讨论】:

  • 哦,当然,不敢相信我没有意识到这一点。为什么它现在不起作用很有意义。但是,如果我仍然想使用这个数组设置,我看不到没有使用 for 循环的解决方案?
  • 如果 height 是一个常数,可以这样做,即得到一个带有 new 的二维数组。但真的吗?
  • @KieronH 请参阅stackoverflow.com/questions/936687/… 了解更多信息
  • @KieronH:我编辑的方法可能对您有用。
  • 哇,谢谢!这正是我想要的!
猜你喜欢
  • 2020-04-02
  • 2021-11-18
  • 1970-01-01
  • 2018-01-09
  • 2021-04-10
  • 2018-04-08
  • 2015-12-31
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多