c - 为什么 memcpy 使用 void 指针作为参数?

标签 c pointers void-pointers

如果函数是: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/

相关文章:

c++ - C++ 与 C 中函数调用中的 void 指针

比较结构指针、丢弃成员和 UB

c - 为什么 tcflush 对 scanf 不起作用?

C++ - 将指针存储在字节数组中?

c - 在c中打印同一行

C |指针|分段故障

swift - swift 将内存设置为 UnsafeMutablePointer<UInt8>

c - 用C语言读取内存块

c - 这是在忙着等待吗?

c - c 中的原始套接字 - 虚假 header 长度