user-0 提问: 为什么free函数的形参是void*类型，传入的是其他类型 指针不报警告？

回复:
user: user-1
content: 你的代码在vs 2015下也没错，我设想是这样改，无法验证    #include <malloc.h>  void myfree(void **ppuff) { 	if (NULL != ( int *)(*ppuff ) ) 	{ 		free( ( int * )(*ppuff) ); 		*ppuff = NULL; 	} }   int main(int argc, char* argv[]) { 	void *x; 	myfree(&x);  	printf("Hello World!\n"); 	return 0; }

user: user-1
content: 你强转成unsigned char *试试，我在vc6下没问题，无linux环境。

user: user-1
content: void **buf的 *buf，是取他的值，你类型是void *的，不知道取什么址。

user: user-2
content: 引用 6 楼 liangchaoxi 的回复:[quote=引用 2 楼 fefe82 的回复:] [quote=引用 楼主 liangchaoxi 的回复:] linux编译器GCC下  为什么free函数的形参是void*类型，传入的是其他类型 指针如 int8*，int32*，不报警告？  比如 int8 *puff = NULL；  free（puff）； 编译器不报类型不符的警告。  而我自己定义的函数  void myfree（void **ppuff) {   if(NULL !=*ppuff) {  free(*ppuff); *ppuff = NULL; }  }  myfree(&puff); 编译器就告警：void** 和 **int8 类型不符。为什么？  如何才能针对这个自己定义的函数去掉这个告警 不能。  指针可以转化为 void * 。  但是 void** 不是 void* 。[/quote]  我知道void*不是void**，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的，我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告，却对用户自定义的void**与int32** 报告警[/quote]  指针可以转换成 void * 。与库函数无关。  关键在与转换的目标。

user: user-3
content: 有可能编译器优化了？判断是指针类型后就强制转换了一把？

user: user-0
content: 引用 4 楼 qq_36409192 的回复:[quote=引用 3 楼 paschen 的回复:] 其他类型指针可以隐式转换为void*  但void*不能隐式转换为其他类型的指针  void* 不等于 void** C++语言在对于void* 类型的使用很特别，因为void* 可以间接引用任何其他数据类型的指针，比如int*、float*甚至抽象数据类型的指针，而且可以从void* 强制转换为任何其他数据类型的指针，所以使用起来有时候会比较危险。[/quote] 我知道void*不是void**，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的，我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告，却对用户自定义的void**与int32** 报告警。其实我就算是定义成myfree(void *p);当我传入一个int8* 的指针时也会告警，为什么为什么库函数不告警？

user: user-4
content: 其他类型指针可以隐式转换为void*  但void*不能隐式转换为其他类型的指针  void* 不等于 void**

user: user-2
content: 引用 楼主 liangchaoxi 的回复:linux编译器GCC下  为什么free函数的形参是void*类型，传入的是其他类型 指针如 int8*，int32*，不报警告？  比如 int8 *puff = NULL；  free（puff）； 编译器不报类型不符的警告。  而我自己定义的函数  void myfree（void **ppuff) {   if(NULL !=*ppuff) {  free(*ppuff); *ppuff = NULL; }  }  myfree(&puff); 编译器就告警：void** 和 **int8 类型不符。为什么？  如何才能针对这个自己定义的函数去掉这个告警 不能。  指针可以转化为 void * 。  但是 void** 不是 void* 。

user: user-4
content: 引用 7 楼 liangchaoxi 的回复:[quote=引用 3 楼 paschen 的回复:] 其他类型指针可以隐式转换为void*  但void*不能隐式转换为其他类型的指针  void* 不等于 void**我知道void*不是void**，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的，我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告，却对用户自定义的void**与int32** 报告警[/quote]  上面不是说了吗，并不是忽略警告，而是 int8*（包括其他类型指针） 转 void*是允许的，但其他不同类型之间的直接转换是会有警告

user: user-5
content: void*和void**能一回事么

user: user-0
content: 引用 3 楼 paschen 的回复:其他类型指针可以隐式转换为void*  但void*不能隐式转换为其他类型的指针  void* 不等于 void**我知道void*不是void**，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的，我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告，却对用户自定义的void**与int32** 报告警

user: user-0
content: 引用 2 楼 fefe82 的回复:[quote=引用 楼主 liangchaoxi 的回复:] linux编译器GCC下  为什么free函数的形参是void*类型，传入的是其他类型 指针如 int8*，int32*，不报警告？  比如 int8 *puff = NULL；  free（puff）； 编译器不报类型不符的警告。  而我自己定义的函数  void myfree（void **ppuff) {   if(NULL !=*ppuff) {  free(*ppuff); *ppuff = NULL; }  }  myfree(&puff); 编译器就告警：void** 和 **int8 类型不符。为什么？  如何才能针对这个自己定义的函数去掉这个告警 不能。  指针可以转化为 void * 。  但是 void** 不是 void* 。[/quote]  我知道void*不是void**，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的，我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告，却对用户自定义的void**与int32** 报告警

user: user-0
content: 引用 1 楼 FancyMouse 的回复:void*和void**能一回事么  你们没有认真看我的题目， 当然知道不一样，所以你看我传入的参数是取了地址的，也就是传入的参数是**类型的

user: user-6
content: 引用 3 楼 paschen 的回复:其他类型指针可以隐式转换为void*  但void*不能隐式转换为其他类型的指针  void* 不等于 void** C++语言在对于void* 类型的使用很特别，因为void* 可以间接引用任何其他数据类型的指针，比如int*、float*甚至抽象数据类型的指针，而且可以从void* 强制转换为任何其他数据类型的指针，所以使用起来有时候会比较危险。