2013-02-18 76 views
2

我在C上有点生疏,我在看memcpy的实现。我想知道为什么你需要将指针pDst转换为无符号字符?对于pSrc也一样?Memcpy Casting C

void memcpy(void *pDst, void *pSrc, int len) 
{ 
    int i; 

    if(pDst == NULL || pSrc == NULL) 
     return; 

    for(i=0; i<len; i++) { 
     ((unsigned char*)pDst)[i] = ((unsigned char*)pSrc)[i]; 
    } 
} 
+3

提示:你将如何解引用一个void *指针?它指的是什么? – 2013-02-18 02:22:01

回答

6

指向void的指针是用于表示“指向任何东西”的有用的速记,但编译器反过来并不知道指向的东西有多大。

所以当你对它做任何类型的算术(比如将它作为一个数组索引)时,你必须使用一些明确的大小。在这种情况下,因为您正在尝试逐字节拷贝,所以您可以使用一个强制转换为unsigned char,这通常是表示“1个字节”的方式。

(这可能乍一看似乎就像是总是事实,但在除了memcpy案件,你可能会指向更大的东西,像某种形式的结构,那么指数/算术实际上将参照增量该结构的大小,所以你可以从一个结构跳到下。)

4

因为不能取消引用void*。你必须明确告诉编译器有多少个字节需要它复制。在unsigned char的情况下,这将是1.

0

,你必须将它转换为char *unsigned char *告诉编译器多少字节必须添加,在char *unsigned char *情况下,将增加1个字节。 下一个元素=实际元+(I *类型的长度) 和void *是一类什么,所以你必须将它转换为char *