执行该代码时:
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/