使用 memcpy 将二维动态数组(指针)复制到静态数组

Copy two dimensional dynamic array(pointers) to a static array using memcpy

我有如下二维数组,

float** src;

其中填充了一些值。

float des[x][x];

x 等于 src 数组中的行数。

所以基本上我想从动态二维数组生成静态二维数组。 我尝试使用 memcpy(&des, src, x),但它给出了错误的结果。

有什么建议吗??

嗯,二维数组元素是连续存储在内存中的, |x| ==记忆细胞

1.row |x|x|x|x|x|x| 2.row |x|x|x|x|x|x| 3.row |x|x|x|x|x|x|

而指针数组的每个指针都可以指向内存中完全不同的地址。例如,第一个指针指向地址 100 上的数组,第二个指针指向地址 248,第三个指针指向地址 2 上的数组。

3.row |x|x|x|x|x|x| |?|?|?| 1.row |x|x|x|x|x|x| |?|?|?|?| 2.row |x|x|x|x|x|x|

所以你可以对数组的每一行单独使用 memcpy,或者逐个元素地复制它们。

希望对您有所帮助。

您的 memcpy 有 2 个问题:

1。 src 行不一定是连续的

考虑:

#define x 2
float src_row_0[x] = { 0.0f, 0.1f };
float src_row_1[x] = { 1.0f, 1.1f };
float * src_rows[x] = { src_row_0, src_row_1 };
float ** src = src_rows;

无法保证内存中的行彼此相邻。所以你不能用单个 memcpy 复制字节。即使您使用 malloc.

分配了 src 行,同样适用

您需要分别复制每一行。

2。大小 x 不足以复制所有字节

memcpy 复制字节数,而不是元素数。单个 float 变量的大小通常超过 1 个字节。简单地将 x 传递给 memcpy 是不够的。您需要将每个项目数乘以单个元素的大小。

修复副本

更正后的副本看起来像这样:

for(int i=0; i<x; ++i) {
    memcpy(&dst[i], src[i], x * sizeof(float));
}

Example on Ideone.