2

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

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];
    }
}
4

3 回答 3

8

指向的指针void是表示“指向任何东西的指针”的有用简写,但相反,编译器不知道所指向的东西有多大。

因此,当您对其进行任何类型的算术运算时(例如将其索引为数组),您必须使用一些明确的大小。在这种情况下,因为您尝试进行逐字节复制,所以您使用强制转换unsigned char,这通常是说“1 字节”的一种方式。

(乍一看,这似乎总是正确的。但在其他情况下memcpy,您可能指向更大的东西,例如某种结构,那么索引/算术实际上是指该结构大小的增量,因此您可以从一个结构跳到下一个结构。)

于 2013-02-18T02:22:30.167 回答
4

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

于 2013-02-18T02:22:05.007 回答
0

您必须将其强制转换为char *unsigned char *告诉编译器必须添加多少字节,char *否则unsigned char *将添加 1 个字节。下一个元素 = 实际上元素 + (i * 类型的长度) 并且void *是无类型,因此您必须将其转换为char *

于 2013-02-18T02:32:28.860 回答