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

时间:2017-08-02 05:48:01

标签: c arrays 2d memcpy

我的2D数组如下所示,

float** src;

里面装满了一些值。

float des[x][x];

x等于src数组中的行数。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

嗯,2D数组元素存储在内存中, | 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,或者逐个元素地复制它们。

希望它有所帮助。

答案 1 :(得分:0)

memcpy有两个问题:

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复制字节。即使您使用src分配了malloc行,也同样适用。

您需要分别复制每一行。

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.