使用memcpy复制2D数组?

Kie*_*onH 4 c++ arrays memcpy

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

 GridUnit** newGrid;
 newGrid = new GridUnit*[width];
    for (int i = 0; i < width; i++)
        newGrid[i] = new GridUnit[height];
Run Code Online (Sandbox Code Playgroud)

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

 memcpy(&newGrid, &grid, height * width * 16);
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 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;
Run Code Online (Sandbox Code Playgroud)

释放变得更简单:

delete[] newGrid[0];
delete[] newGrid;
Run Code Online (Sandbox Code Playgroud)

没有delete[]newGrid[i],i > 0因为他们没有自己的块,他们只是指向单个大块.因为一切都是连续的,所以您可以将newGrid[0]其视为指向第一行(height元素)或整个二维数组(width * height元素)的指针.

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

memcpy(newGrid[0], oldGrid[0], height * width * sizeof newGrid[0][0]);
Run Code Online (Sandbox Code Playgroud)