如何解决C语言printf警告:格式指定void*类型但参数为char类型
警告原因
%p 格式化占位符要求传入参数为 void* 类型的指针,你两处传参都是取的 char 类型的字符值:*myString 是字符串首字符'D',myString[x] 是下标x对应的字符,类型不匹配所以触发 -Wformat 警告。
解决方法
你当前的输出是把字符的ASCII值按地址格式打印,0值输出为(nil),要保留这个输出同时消除警告,只需要把char值强制转换为void*类型即可。标准跨平台写法需要引入stdint.h的uintptr_t做中间转换,避免不同架构下整数和指针长度不匹配的问题。
修改后完整代码如下:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() { char *myString = "Daniel"; int x; printf("\nThe pointer variable's value is %p\n", (void*)(uintptr_t)*myString); printf("\nThe pointer variable points to %s\n", myString); printf("\nThe memory location for each character are: \n"); for (x = 0;x < 7;x++){ printf("%p\n", (void*)(uintptr_t)myString[x]); } return 0; }
如果你的运行平台是常见的x86/ARM 32位/64位环境,不想加额外头文件,也可以直接简化为(void*)*myString和(void*)myString[x],大部分编译器都可以正常编译无警告,输出和原版本完全一致。
内容的提问来源于stack exchange,提问作者SimTim124
相关产品推荐
相关产品推荐

