为什么memcpy中要指定const void *
void copyBytes(char *x, char *y, int howMany)
首先是你的指针char *
,这意味着除了char *
需要显式转换之外的任何指针类型.您应该使用void *
,隐式转换指针类型.
uint16_t a, b;
copyBytes(&a, &b, sizeof(a)); // &a and &b are uint16_t*, not char*.
第二,来源,y
不是const
,这意味着如果您通过const
来源,您将收到警告.
char buf[512];
const char str[] = "Hello world"; // Contents of string are constant.
copyBytes(buf, str, sizeof(str)); // With your code, this produces a warning.
第三,howMany
签名,意味着您可以传递负值.
我会推荐这样的签名(顺便说一句,这非常相似memcpy
):
void copyBytes(void *x, const void *y, size_t howMany)
第四个批评... libc memcpy
可能会更好地进行优化,使用大于字节的单位,特定于平台的性能技巧(例如:内联汇编,x86上的SSE)等等.还有memmove
更好的指定行为.缓冲区重叠.
总结:为了学习的目的,自己编写这些例程是很好的,但是通常你会更好地使用C库.