代码之家  ›  专栏  ›  技术社区  ›  Niluka

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

  •  0
  • Niluka  · 技术社区  · 7 年前

    我有如下2D数组,

    float** src;
    

    float des[x][x];
    

    x 等于中的行数 src 大堆

    基本上我想从动态2D数组中生成一个静态2D数组。 我试着使用 memcpy(&des, src, x)

    有什么建议吗??

    2 回复  |  直到 7 年前
        1
  •  1
  •   kocica    7 年前

    2D数组元素以行的形式存储在内存中,

    1.row | x | x | x | x | x | 2.row | x | x | x | x | 3.row | x | 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.行| x | x | x | x | x|

    因此,您可以在每一行数组上单独使用memcpy,或者逐元素复制它们。

        2
  •  0
  •   user694733    7 年前

    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 这还不够。您需要将每个项目数乘以单个元素的大小。

    修复副本

    更正后的副本如下所示:

    for(int i=0; i<x; ++i) {
        memcpy(&dst[i], src[i], x * sizeof(float));
    }
    

    Example on Ideone.