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

使用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| 而指针数组的每个指针都可

我有如下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|

而指针数组的每个指针都可以指向内存中完全不同的地址。例如,第一个指针指向地址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一次。请尝试理解
**
的含义。您可以使用memcpy
x
多次执行此操作