我是不是用错了memcpy?

我是不是用错了memcpy?,c,memcpy,C,Memcpy,在下面的代码段中,我希望函数接受可以是任何数据类型(在本例中为整数)的双指针(2D数组),并使用memcpy将数组中的一个元素一次复制到另一个变量。它已通过编译器,但仍显示访问冲突 我看了论坛的每一个地方,但仍然不能得到这个权利 任何提示都将不胜感激。我几乎为C语言的复杂性所震惊 void ShowImg(void **ptr, IplImage *sample, char window_name[]) { int value; IplImage *sml_img= cvCrea

在下面的代码段中,我希望函数接受可以是任何数据类型(在本例中为整数)的双指针(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);

}
void showmg(void**ptr,IplImage*示例,字符窗口\ u名称[])
{
int值;
IplImage*sml_img=cvCreateImage(cvSize(样本->宽度,样本->高度),IPL_深度_8U,1);
for(int j=0;jheight;j++)
for(inti=0;iwidth;i++){
memcpy(&value,ptr+i*sizeof(int)+j*sample->width*sizeof(int),sizeof(int));
((uchar*)(sml\u img->imageData+sml\u img->widthStep*j))[i]=值;
printf(“%d,%d\n”,i,j);
}
cvNamedWindow(窗口名称);
cvShowImage(窗口名称、sml\U img);
cvWaitKey(0);
CVU窗口(窗口名称);
cvReleaseImage(&sml_img);
}
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);
这一行:

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)
scaling让我感到困惑;如果编译器在编译时知道您的数据类型,那么您不应该需要它。为什么数组是一个
void**
而不是编译器可以使用的更具体的东西?(
int**
将是一个很好的开始,但我不太擅长C语言中的多维数组,因此我不确定这将是一个更好的替代品。但我确实不喜欢您现在拥有的。:)

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);
这一行:

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)
scaling让我感到困惑;如果编译器在编译时知道您的数据类型,那么您不应该需要它。为什么数组是一个
void**
而不是编译器可以使用的更具体的东西?(
int**
将是一个很好的开始,但我不太擅长C语言中的多维数组,因此我不认为这会是一个更好的替代。但我确实不喜欢你现在拥有的。:

我认为这里有一个错误:
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)
)我认为这里有一个错误:
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)
相同)

如果要将某个值赋值给
value
,为什么不直接使用赋值?因为我希望函数更通用,所以我向函数传递一个“void**”指针。因此,我可以在不重写代码的情况下分配任何数据类型。如果您想为
分配某些内容,为什么不直接使用赋值?因为我希望函数更通用,所以我向函数传递了一个“void**”指针。因此,我可以在不重写代码的情况下分配任何数据类型。编译器如何知道“ptr+1”的内存位置?这是一种空洞的类型。因为在本例中“ptr”实际上是一个2dint数组,所以每次访问元素时我都会增加4字节。如果它是双精度的,我将增加8个字节。编译器知道变量的类型(在您的例子中是
void**
),因为它是声明的(在本例的函数参数中)。因此,它知道每次向指针添加X时,都会向指针添加X*sizeof(void*)。这是指针算法。(详见此处:)谢谢。我不知道void*的大小是4字节。看来问题解决了;void*是地址的大小。在4字节的32位计算机上,在8字节的64位计算机上。@user422005-由于前面关于指针大小的参数,我甚至不想讨论:)编译器如何知道“ptr+1”的内存位置?这是一种空洞的类型。因为在本例中“ptr”实际上是一个2dint数组,所以每次访问元素时我都会增加4字节。如果它是双精度的,我将增加8个字节。编译器知道变量的类型(在您的例子中是
void**
),因为它是声明的(在本例的函数参数中)。因此,它知道每次向指针添加X时,都会向指针添加X*sizeof(void*)。这是指针算法。(详见此处:)谢谢。我不知道void*的大小是4字节。看来问题解决了;void*是地址的大小。在一台4字节的32位计算机上,在一台8字节的64位计算机上。@user422005-由于前面关于指针大小的参数,我甚至不想讨论这个:)