我使用memcpy错了吗?

时间:2011-04-05 07:55:26

标签: c memcpy

在下面的代码片段中我希望函数接受一个双指针(2D数组),它可以是任何数据类型(在本例中为整数),并使用memcpy将一个元素一次复制到另一个变量。它通过了编译器,但仍显示访问冲突。

我在论坛周围到处寻找,但仍然无法做到这一点。

任何提示都表示赞赏。我几乎被C的复杂性所摧毁。

void ShowImg(void **ptr, IplImage *sample, char window_name[])
{
    int value;
    IplImage *sml_img= cvCreateImage(cvSize(sample->width,sample->height),IPL_DEPTH_8U, 1);
    for(int j=0; j<sample->height; j++)
        for(int i=0; i<sample->width; i++){
            memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));
            ((uchar *)(sml_img->imageData + sml_img->widthStep*j))[i] = value;
            printf("%d,%d\n", i, j);
        }
    cvNamedWindow(window_name);
    cvShowImage(window_name, sml_img);
    cvWaitKey(0);
    cvDestroyWindow(window_name);
    cvReleaseImage(&sml_img);

}

2 个答案:

答案 0 :(得分:3)

我认为这里有一个错误:ptr+i*sizeof(int)因为ptr类型为void** ptr + 1是下一个元素,意思是ptr+sizeof(void*),为什么要将它乘以的sizeof(int)的

例如:

ptr = 0x00000000, 
sizeof(void*) = 4, 
sizeof(int) = 4
||
\/
ptr+1 = 0x00000004. 
ptr+1*sizeof(int) = 0x00000010.

我认为这不是你想要的。 (关于j*sample->width*sizeof(int)

答案 1 :(得分:1)

memcpy(3)实际上用于复制大于基元类型的对象。你可以替换这一行:

memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));

这一行:

value = ptr+i*sizeof(int)+j*sample->width*sizeof(int);

sizeof(int)缩放让我失望;如果编译时编译器知道您的数据类型,则不需要这样做。为什么你的数组是void **而不是更具体的东西,编译器可以使用它? (int **将是一个良好的第一次开始,但我不擅长C中的多维数组,所以我不肯定这将是一个更好的替代。但我不喜欢你现在拥有的。:)