为什么free函数的形参是void*类型,传入的是其他类型 指针不报警告?

liangchaoxi 2016-12-20 04:46:49
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 类型不符。为什么?

如何才能针对这个自己定义的函数去掉这个告警
...全文
837 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2016-12-21
  • 打赏
  • 举报
回复
你的代码在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;
}


用户 昵称 2016-12-21
  • 打赏
  • 举报
回复
你强转成unsigned char *试试,我在vc6下没问题,无linux环境。
用户 昵称 2016-12-21
  • 打赏
  • 举报
回复
void **buf的 *buf,是取他的值,你类型是void *的,不知道取什么址。
fefe82 2016-12-21
  • 打赏
  • 举报
回复
引用 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 * 。与库函数无关。 关键在与转换的目标。
qq_36003911 2016-12-21
  • 打赏
  • 举报
回复
有可能编译器优化了?判断是指针类型后就强制转换了一把?
liangchaoxi 2016-12-20
  • 打赏
  • 举报
回复
引用 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* 的指针时也会告警,为什么为什么库函数不告警?
paschen 2016-12-20
  • 打赏
  • 举报
回复
其他类型指针可以隐式转换为void* 但void*不能隐式转换为其他类型的指针 void* 不等于 void**
fefe82 2016-12-20
  • 打赏
  • 举报
回复
引用 楼主 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* 。
paschen 2016-12-20
  • 打赏
  • 举报
回复
引用 7 楼 liangchaoxi 的回复:
[quote=引用 3 楼 paschen 的回复:] 其他类型指针可以隐式转换为void* 但void*不能隐式转换为其他类型的指针 void* 不等于 void**
我知道void*不是void**,所以你看我传入的参数是取了地址的,也就是传入的参数是**类型的,我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告,却对用户自定义的void**与int32** 报告警[/quote] 上面不是说了吗,并不是忽略警告,而是 int8*(包括其他类型指针) 转 void*是允许的,但其他不同类型之间的直接转换是会有警告
FancyMouse 2016-12-20
  • 打赏
  • 举报
回复
void*和void**能一回事么
liangchaoxi 2016-12-20
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
其他类型指针可以隐式转换为void* 但void*不能隐式转换为其他类型的指针 void* 不等于 void**
我知道void*不是void**,所以你看我传入的参数是取了地址的,也就是传入的参数是**类型的,我的意思是为什么库函数可以忽略void* 与 int8* 的类型不同警告,却对用户自定义的void**与int32** 报告警
liangchaoxi 2016-12-20
  • 打赏
  • 举报
回复
引用 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** 报告警
liangchaoxi 2016-12-20
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
void*和void**能一回事么
你们没有认真看我的题目, 当然知道不一样,所以你看我传入的参数是取了地址的,也就是传入的参数是**类型的
ck2333 2016-12-20
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
其他类型指针可以隐式转换为void* 但void*不能隐式转换为其他类型的指针 void* 不等于 void**
C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*、float*甚至抽象数据类型的指针,而且可以从void* 强制转换为任何其他数据类型的指针,所以使用起来有时候会比较危险。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧