如果函数是:void memcpy(char* dst, const char* src, size_t size)
是否可以?
在 memcpy() 中使用 void 指针有什么好处?
最佳答案
在 1989 年的标准中添加 void
数据类型之前, 就是这样设计 memcpy
等函数的。 char *
是当时最接近“通用”指针的东西。
问题是,如果 memcpy
仍然使用 char *
参数并且您想在不是数组的目标上调用 memcpy
char
,您必须显式转换指针值:
int foo[N];
int bar[N];
...
memcpy( (char *) foo, (const char *) bar, N * sizeof *foo );
因为你不能在没有转换的情况下将一种类型的指针分配给另一种类型。这在 ANSI C 之前的版本中不是(大部分)问题,因为您没有函数原型(prototype);也就是说,编译器没有检查函数调用中参数的数量和类型是否与定义匹配,但现在这肯定是个问题。
但是,与其他对象指针类型不同,您可以将任何 T *
值分配给 void *
并再次返回,而无需强制转换,因此 memcpy
调用可以写成
memcpy( foo, bar, N * sizeof *foo );
我记得标准化前的日子(虽然我还在上大学)。类型转换体操并不好玩。拥抱 void *
类型,因为它可以减轻你的胃痛。
关于c - 为什么 memcpy 使用 void 指针作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781600/