使用 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));
}
我有如下二维数组,
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));
}