为什么在 memcpy 的实现中将 'void*' 指针强制转换为 'unsigned char'?

问题描述 投票:0回答:3

我正在查看

memcpy
的实现,并且想知道,为什么需要将指针
pDst
转换为
unsigned char
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];
    }
}
c pointers casting implementation memcpy
3个回答
8
投票

指向

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

因此,当您对它进行任何类型的算术(例如将其索引为数组)时,您必须使用一些显式大小。在这种情况下,因为您尝试进行逐字节复制,所以您使用

unsigned char
的强制转换,这通常是表示“1 字节”的一种方式。

(乍一看这似乎是always正确的。但是在

memcpy
之外的情况下,您可能会指向更大的东西,比如某种结构,那么索引/算术实际上会指的是增量该结构的大小,以便您可以从一个结构跳到下一个。)


4
投票

因为你无法取消引用

void*
。您必须明确告诉编译器您希望它复制多少字节。如果是
unsigned char
,则为 1。


0
投票

您必须将其转换为

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

© www.soinside.com 2019 - 2024. All rights reserved.