我想最后使用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?
答案 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
这样的东西是有意义的。