c - Memcpy 类型转换 C

标签 c

我对 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];
    }
}

最佳答案

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

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

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

关于c - Memcpy 类型转换 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928555/

相关文章:

c - 阻止调用 `dlsym` (RTLD_NEXT)

c - 系统调用表黑客玩具示例在 64 位上不起作用

c - 如何动态地为结构体赋值

c - strcmp() 和有符号/无符号字符

c++ - 如何在次线性时间内从行优先数组中选择列?

c - c中的strlen错误

C 函数指针调用语法

c - 调整终端大小时 Ncurses 程序退出

c - 将符号表中的符号名称替换为可重定位 ELF 目标文件中的新的较长名称

c++ - 如何找到 `FILE*`的相对地址