2010-12-20 44 views
0

我想用到底的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: error: invalid operands to binary * (have ‘unsigned int’ and ‘int **’)
src/coder.c:910: error: invalid operands to binary * (have ‘unsigned int’ and ‘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

请参阅memcpy的联机帮助页。 – 2010-12-20 21:59:24

+0

您将无符号整数乘以指针。你不能这样做(你不想)。 – Roddy 2010-12-20 22:01:44

回答

1

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

memcpy的第三个参数是要复制的字节数。您正确得到int * 的大小,但是您希望将其乘以结构中int *的数目。所以,如果我理解正确的代码,您可能需要使用

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

因为要复制的结构似乎包含了许多INT双指针。

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

+0

谢谢你们,那是正确的做法。我已经做到了,只是发布了错误的代码。我不再犯错误,但该程序无法正常工作。无论如何感谢 – bruno 2010-12-20 22:31:31

+0

正如我在编辑中提到的那样,看看David Yaw的回答。他有比我更好的答案,因为我忘记了你可能在for循环中分别分配了每个子数组。这意味着它们可能不是连续的,需要分别memcpy。你应该使用sizeof(int),而不是sizeof(int **),因为你在计算整数,int **就是指向它们的东西。尽管在大多数情况下,这将是相同的。 – Derek 2010-12-21 17:52:08

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

sizeof(int **)*block_orig是大小与指针的乘积。我想你知道,乘上一个指针并不合适,也不可能从编译器错误中看到。

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

在你的整数矩阵的情况下,如果目标存储器是连续的(即二维数组),那么类似sizeof(int) * numberOfElementsToCopy就会有意义。

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]); 
} 
+0

乘以sizeof(int)不一定正确,因为int不必与指针的大小相同。我相信。 :)我认为他是正确的使用sizeof(int **)。 – Derek 2010-12-20 22:09:46

+0

他试图复制数据,而不是指向存储的指针。我认为sizeof(int)是正确的,但int **意味着单个memcpy不会这样做。请参阅编辑。 – 2010-12-20 22:14:32

+0

啊,真的。我误解了他的数据结构。 – Derek 2010-12-20 22:19:23