0

我想最后使用 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?

4

3 回答 3

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]);

Anint**是指向整数数组的指针数组。如果你试图 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]);
}
于 2010-12-20T22:06:32.143 回答
2

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

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

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

因为您正在复制的结构似乎包含那么多 int 双指针。

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

于 2010-12-20T22:06:19.340 回答
0
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig);

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

我不知道block_orig你的其他(顺便说一句,你听说过自描述变量名吗?)变量是什么意思,但memcpy将目标、源和字节大小作为参数。

在您的整数矩阵情况下,如果目标内存是连续的(即 2D 数组),类似的东西是sizeof(int) * numberOfElementsToCopy有意义的。

于 2010-12-20T22:06:22.177 回答