c - 在为副本进行转换后,我是否需要再次对 void 指针进行类型转换以进行算术?

标签 c pointers casting void

执行该代码时:

void    *ft_memcpy(void *dest, const void *src, size_t n)
{
    void    *orgdest;

    orgdest = dest;
    while (n > 0)
    {
        *(unsigned char *)dest = *(unsigned char *)src;
        n--;
        dest++;
        src++;
    }
    return (orgdest);
}

void 指针已被类型转换为 unsigned char* 以从 src 复制到 dest。 然后我在 while 循环内使用指针(dest++; src++;)。我是否应该再次将它们转换为算术(因为它们是 void*,并且不能用于算术),例如 dest = ((unsigned char *)dest + 1);或者它们是否已经转换为 unsigned char 类型并且可以使用?

最佳答案

是的,您需要将指针转换为 arithmetic on void * pointers is illegal in C 。请注意,增量不是正确的语法,因此您需要这样做

void    *ft_memcpy(void *dest, const void *src, size_t n)
{
    void    *orgdest;

    orgdest = dest;
    while (n > 0)
    {
        *(unsigned char *)dest = *(unsigned char *)src;
        n--;
        dest = ( unsigned char * ) dest + 1;
        src = ( unsigned char * ) src + 1;
    }
    return (orgdest);
}

请注意,创建 unsigned char * 类型的本地副本更容易理解:

void    *ft_memcpy(void *dest, const void *src, size_t n)
{
    const unsigned char *local_src = src;
    unsigned char *local_dest = dest;

    while (n > 0)
    {
        *local_dest = *local_src;
        n--;
        local_dest++;
        local_src++;
    }
    return (dest);
}

关于c - 在为副本进行转换后,我是否需要再次对 void 指针进行类型转换以进行算术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62678530/

相关文章:

c - 在 C 中将指针分配给变量和将指针分配给数组

c - 从 C 函数返回数组时出错

c++ - 为什么在我使用类型转换的地方给我输出 2?

c++ - 使用 Arduino 将字符串转换为类型 const char*

java - 类转换异常 : fragment 1 cannot be cast to fragment 2

c++ - 如何在 Windows 7 中安装 MinGW 64 位

c - 访问嵌套结构时出现段错误

c - 使用 static 而不是 malloc - C 语言

c - 不完整数组类型的 p[0] 和 *p 等价

c++ - 在充满指针的 std::vector 上使用 std::remove_if