我被要求实现我自己的memcopy版本。这是我从互联网上找到的。令我困惑的是,我们有两个mp = [quad(mofp, p_bar, pres, args=(mu, Z))[0] for p_bar in pwf]
指针,为什么我们将它们强制转换为void *
?
这是否正确?
char*
答案 0 :(得分:3)
需要强制转换,因为您可能无法取消引用void *
类型的指针。因此,当src[i]
是src
类型的指针时,您可能不会写void *
。 void类型是不完整的类型。
至于功能,那就错了。
如果查看标准函数memcpy
的声明,您会看到它被声明为
void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
^^^^^^ ^^^^^^^^^^^
因此,您编写的函数应该至少看起来像
void * memcpy(void *s1, const void *s2, size_t n);
函数定义可以看起来像这个演示程序中所示。
#include <stdio.h>
void * myMemCpy(void *s1, const void *s2, size_t n)
{
const unsigned char *src = s2;
unsigned char *dsn = s1;
while ( n-- ) *dsn++ = *src++;
return s1;
}
int main(void)
{
char s1[] = "Hello";
char s2[sizeof( s1 )];
puts( ( char * )myMemCpy( s2, s1, sizeof( s1 ) ) );
return 0;
}
程序输出
Hello
答案 1 :(得分:0)
您需要对它们进行类型转换,因为“类型”void
没有大小(请注意void *
)。
然后你的循环一次可以移动一个char
(理想情况下是一个字节)。