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

时间:2013-07-22 06:56:08

标签: c pointers void-pointers

如果函数是:void memcpy(char* dst, const char* src, size_t size)

,那会没关系

在memcpy()中使用void指针有什么好处?

3 个答案:

答案 0 :(得分:4)

在1989年标准中添加void数据类型之前, 是如何设计memcpy之类的函数的。 char *是最接近" generic"当时的指针。

问题是如果memcpy仍然使用了char *个参数,并且您想要在不是memcpy数组的目标上调用char,那么必须显式地转换指针值:

int foo[N];
int bar[N];
...
memcpy( (char *) foo, (const char *) bar, N * sizeof *foo );

因为您无法在没有强制转换的情况下将一种类型的指针指定给另一种类型。这在ANSI C之前并不是一个问题(因为你没有功能原型);也就是说,编译器没有检查函数调用中参数的数量和类型是否与定义匹配,但它现在肯定是个问题。

但是,与其他对象指针类型不同,您可以将任何T *值分配给void *,然后再返回,而无需强制转换,因此memcpy调用可以写为

memcpy( foo, bar, N * sizeof *foo );

我记得标准化前的日子(虽然我还在上大学)。铸造体操并不好玩。拥抱void *类型,因为它可以为您节省一些胃灼热。

答案 1 :(得分:2)

  

如果函数是:void memcpy(char * dst,const char * src,size_t size)会没关系吗?

是的,因为指针可以转换为另一种指针类型。

  

在memcpy()中使用void指针有什么好处?

避免强制转换为目标指针类型。

答案 2 :(得分:2)

  

void中使用memcpy()指针有什么好处?

void指针是一个通用指针,因此它可以接受指向任何类型的指针。