如何使用Memcpy()函数

时间:2010-12-20 21:57:26

标签: c++ c memcpy

我想最后使用memcpy而不是

block_orig_left[i1][j1]=block_orig[i1][j1];
pred_orig_left [i1][j1]=block_pred[i1][j1];

我使用memcpy

时出错
  

src / coder.c:909:错误:无效操作数到二进制*(有'unsigned int'和'int **')
  src / coder.c:910:错误:无效操作数到二进制*(有'unsigned int'和'int **')

int **block_orig_left=NULL;

block_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]);
pred_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]);

for(i1=0; i1<BSIZE_Y_LEVEL[levelv]; i1++)
for(j1=0; j1<BSIZE_X_LEVEL[levelv]; j1++)
{
    block_orig_left[i1][j1]=block_orig[i1][j1];
    pred_orig_left[i1][j1]=block_pred[i1][j1];
    Average_block_orig_left+=block_orig[i1][j1];        
} 
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig);

memcpy(pred_orig_left, block_pred,  sizeof(int **)*block_pred);

如何正确使用memcpy?

3 个答案:

答案 0 :(得分:4)

我假设block_orig,block_pred,block_orig_left和pred_orig_left都声明为int**。您的代码中只显示其中一个。

您获得的错误位于memcpy sizeof(int **)*block_orig的参数中。您试图将整数(sizeof(int**))与int **类型的变量相乘。编译器无法理解该乘法。

您需要将长度参数修改为memcpy,但仍然无法按预期工作。

// Still won't work.
memcpy(block_orig_left, block_orig, sizeof(int) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv]);

int**是指向整数数组的指针数组。如果你试图memcpy int **,你最终会覆盖外部数组。因此,我认为你需要一个循环并复制内部数组。

这应该有效。

for(int i = 0; i < BSIZE_Y_LEVEL[levelv]; i++)
{
    memcpy(block_orig_left[i], block_orig[i], sizeof(int) * BSIZE_X_LEVEL[levelv]);
}

答案 1 :(得分:1)

您将int **的大小乘以int **,这没有意义。换句话说,如果你想知道卡车上所有汽车的重量,你不能将“1辆汽车的重量”乘以“卡车”。你必须将1辆汽车的重量乘以卡车上的汽车数量。

memcpy的第三个参数是您要复制的字节数。您正确地获得了int * 的大小,但是您希望将其乘以结构中的int *的数量。所以,如果我正确理解你的代码,你会想要使用

sizeof(int**) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv]

因为你复制的结构似乎包含许多int双指针。

编辑:看看David Yaw的回答,我意识到他是对的。我没有解决这样一个事实:内部指针可能不是一次全部分配,而是在for循环或其他东西中,所以它们需要以类似的方式复制。我上面的方法会复制适量的内存,但它不一定是正确的内存。

答案 2 :(得分:0)

memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig);

sizeof(int **)*block_orig是大小与指针的乘法。我想你知道,从编译器错误中可以看出,乘以指针没有意义也不可能。

我不知道block_orig或你的其他人(你听说过自描述变量名吗?)变量意味着什么,但memcpy取得了目标,来源和大小bytes作为参数。

在整数矩阵的情况下,如果目标存储器是连续的(即2D数组),像sizeof(int) * numberOfElementsToCopy这样的东西是有意义的。