我的2D数组如下所示,
float** src;
里面装满了一些值。
float des[x][x];
x
等于src
数组中的行数。
所以基本上我想从动态2D数组生成静态2D数组。
我试图使用memcpy(&des, src, x)
,但它会给出错误的结果。
有什么建议吗?
答案 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
有两个问题:
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
行,也同样适用。
您需要分别复制每一行。
x
不足以复制所有字节 memcpy
复制字节数,而不是元素数。单个float
变量的大小通常超过1个字节。仅仅将x
传递给memcpy
是不够的。您需要将每个项目的数量乘以单个元素的大小。
更正的副本看起来像这样:
for(int i=0; i<x; ++i) {
memcpy(&dst[i], src[i], x * sizeof(float));
}