为何C程序可正常运行但编译时出现格式匹配警告?
为什么会出现这个格式不匹配警告?
嘿,这个警告的根源其实很直白,咱们一步步拆解:
首先,sizeof 运算符的返回值类型是 size_t——这是C标准定义的无符号长整型(long unsigned int),而你在printf里用的%d格式符,是专门用来匹配**有符号整型(int)**的。两者类型不匹配,编译器就会贴心抛出警告提醒你啦。
看你代码里这三行:
printf("Line 1 - Size of variable a = %d\n", sizeof(a)); printf("Line 2 - Size of variable b = %d\n", sizeof(b)); printf("Line 3 - Size of variable c = %d\n", sizeof(c));
每一行的sizeof(变量)都是size_t类型,和%d预期的int类型不匹配,所以才会三次触发一模一样的警告。
怎么修复这个问题?
有两种标准且安全的解决方式:
- 方式一(推荐,C99及以后标准支持):使用
size_t对应的专用格式符%zu
修改后的代码示例:printf("Line 1 - Size of variable a = %zu\n", sizeof(a)); printf("Line 2 - Size of variable b = %zu\n", sizeof(b)); printf("Line 3 - Size of variable c = %zu\n", sizeof(c)); - 方式二(兼容老版本C标准):把
sizeof的结果强制转换为unsigned int,搭配%u格式符
修改后的代码示例:printf("Line 1 - Size of variable a = %u\n", (unsigned int)sizeof(a)); printf("Line 2 - Size of variable b = %u\n", (unsigned int)sizeof(b)); printf("Line 3 - Size of variable c = %u\n", (unsigned int)sizeof(c));
两种方式都能消除编译器警告,同时保证输出结果正确~
内容的提问来源于stack exchange,提问作者user9774180
相关产品推荐
相关产品推荐

