memcpy将较小的数组连接成较大的数组

时间:2016-01-11 07:17:51

标签: c arrays buffer memcpy

我试图弄清楚如何使用memcopy来获取少量数据并将其组合成更大的数组。这是c而不是c ++。

memcpy(void* dest, void* src, size_t n);

所以我将dest缓冲区设置为src缓冲区和要复制的数据量。

我一直在尝试,但我没有得到我期望的结果。我只想获取4个值浮点数组的8个副本并将其打包到一个32值浮点数组中。

float test[32];
float tmp[4] = {9, 8, 7, 6};
printf("size of tmp:%lu sizeof tmp/ tmp[0]:%lu\n", sizeof(tmp),
       (sizeof(tmp) / sizeof(tmp[0])));
printf("============\n");

使用printf来检查尺寸,4浮动是16,1浮动的大小是4,只是我的健全检查。

memcpy(test, tmp + (sizeof(tmp)*0), sizeof(tmp));  //this is the initial offset at 0
memcpy(test + (sizeof(tmp)*1), tmp, sizeof(tmp)); //this should copy to the test buffer plus and offset of 16 bytes
memcpy(test + (sizeof(tmp)*2), tmp, sizeof(tmp)); //etc

for (int i = 0; i < 32; i++) {
    printf("%f ", test[i]);
    if (i > 1 && i % 4 == 0) printf("\n");
}

似乎只复制了最初的4个字节,所有后续的字节都失败了。

使用偏移量的原因是我想要概括这一点,但即使写出这样一个只复制16字节偏移量的简单用例也无效。

我得到这个打印输出:

size of tmp:16 sizeof tmp/ tmp[0]:4
============
9.000000 8.000000 7.000000 6.000000 0.000000
0.000000 0.000000 0.000000 1602397014491231940111075790290944.000000
0.000000 -6544621971295550046208.000000 0.000000 0.000000
0.000000 1602345021009581954139530027073536.000000 0.000000 9.000000
8.000000 7.000000 6.000000 0.000000
0.000000 -1796536614528950701815653974964961280.000000 0.000000 0.000000
0.000000 0.000000 0.000000 1602345021009581954139530027073536.000000

现在我可以理解随机数意味着内存未正确初始化但我无法弄清楚为什么memcpy没有按预期工作。

2 个答案:

答案 0 :(得分:4)

test是一个浮点指针,sizeof(tmp)的大小是字节。

指针运算将导致您转到错误的偏移量。

尝试:

memcpy(test + ((sizeof(tmp)/sizeof(tmp[0]))*1), tmp, sizeof(tmp))

答案 1 :(得分:0)

只需编写可读代码,所有问题通常都会消失:

void copy_floats (float*        dest, 
                  const float*  src, 
                  size_t        items_n,
                  size_t        copies_n)
{
  for(size_t i=0; i<copies_n; i++)
  {
    memcpy(&dest[i * items_n], 
           src, 
           sizeof(*src) * items_n);
  }
}

呼叫者:

copy_floats(test, tmp, 4, 8);

(如果您想要进行预测/高级,请将参数声明为float* restrict destconst float* restrict src以便更好地进行优化)