使用memcpy将二维动态数组(指针)复制到静态数组
我有如下2D数组使用memcpy将二维动态数组(指针)复制到静态数组,c,arrays,2d,memcpy,C,Arrays,2d,Memcpy,我有如下2D数组 float** src; 其中填充了一些值 float des[x][x]; x等于src数组中的行数 所以基本上我想从动态2D数组生成一个静态2D数组。 我试图使用memcpy(&des,src,x),但它给出了错误的结果 有什么建议吗?嗯,2D数组元素以一行的形式存储在内存中, |x |==存储单元 1.排| x | x | x | x | x | 2.排| x | x | x | x | 3.排| x | x | x | x | x | x| 而指针数组的每个指针都可
float** src;
其中填充了一些值
float des[x][x];
x
等于src
数组中的行数
所以基本上我想从动态2D数组生成一个静态2D数组。
我试图使用memcpy(&des,src,x)
,但它给出了错误的结果
有什么建议吗?嗯,2D数组元素以一行的形式存储在内存中, |x |==存储单元 1.排| x | x | x | x | x | 2.排| x | x | x | x | 3.排| x | x | x | x | x | x| 而指针数组的每个指针都可以指向内存中完全不同的地址。例如,第一个指针指向地址100上的数组,第二个指针指向地址248,第三个指针指向地址2上的数组 3.排| x | x | x | x | x | x | x | 1.排| x | x | x | x | x | x | x | 2.排| x | x | x | x | x | x| 因此,您可以在数组的每一行上单独使用memcpy,或者逐个元素复制它们
希望有帮助。您的
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
复制字节。即使您使用malloc
分配了src
行,也同样适用
您需要分别复制每一行
2.大小x
不足以复制所有字节
memcpy
复制字节数,而不是元素数。单个float
变量的大小通常大于1字节。仅仅将x
传递给memcpy
是不够的。您需要将每个项目数乘以单个元素的大小
修改副本
更正后的副本如下所示:
for(int i=0; i<x; ++i) {
memcpy(&dst[i], src[i], x * sizeof(float));
}
for(int i=0;我需要复制每一行。float**
在内存中不是连续的。您不能只使用memcpy一次。请尝试理解**
的含义。您可以使用memcpyx
多次执行此操作