为什么我得到关于printf()的警告,%s将类型void*作为参数?

Tom*_*rds 2 c printf

我从C编程的第19章,现代方法开始编程项目4 .我的代码有效但我收到此警告试图传递一个函数返回void *参数到printf转换说明符%s.

format %s需要类型的参数char *,但参数2具有类型void * [-Wformat=]

我可以通过将函数的返回类型转换为char *类似来轻松地消除警告

printf("%s\n", (char *) function(param));
Run Code Online (Sandbox Code Playgroud)

但我只是想知道为什么这是必要的,因为类型void *会自动转换为另一种指针类型.

Sou*_*osh 5

编译器在这种情况下抱怨是非常正确的.

根据你的逻辑本身,返回的函数void *可以返回一个结构指针void *,然后,%s将无法打印,不是吗?

所以,如果你知道你在做什么,你可以为这种情况出结果.

另外,正如其他人所指出的那样,也许值得一提的是,这个警告与标准规范无关,就像在标准中一样,对参数的类型没有限制.(借用@WhozCraig先生的话)这个警告基本上是由于一个额外的类型检查层完全由编译器自己执行,由-Wformatflag in 启用gcc.