Ubuntu下gcc编译含scanf的C代码出现格式匹配警告求助
问题原因
你遇到的是格式说明符与传入指针类型不匹配的编译告警,并非致命编译错误,你的代码实际上还是会生成可执行文件,但存在运行风险,具体原因如下:
scanf的%d格式符用于读取标准输入的十进制整数,要求传入的目标地址指针必须是int *类型;你声明的变量c是char类型,取地址后得到的&c是char *类型,和%d要求的参数类型不符,因此gcc抛出该告警。- 大学课程中老师说代码可正常运行,大概率是课程使用的编译器版本较旧、告警等级低,或是使用了Turbo C等老旧的16位编译环境,这类环境对类型匹配的检查不严格,不会触发该告警,甚至在小范围输入时不会触发异常,但这种写法本身属于C语言的未定义行为,不具备兼容性。
- 额外风险说明:当前Ubuntu系统下
int类型通常占4字节内存,char仅占1字节,用%d向char类型地址写数据时,会额外覆盖栈上相邻的3字节内存,轻则导致其他变量值异常,重则直接触发段错误崩溃。
修复方案
有两种常见的合规写法可以消除告警:
- 调整变量类型为
int,这是更推荐的写法,输出时int类型会自动转换为对应ASCII字符输出,修改后的代码如下:
#include <stdio.h> int main() { int c; printf("Inserire la codifica numerica :"); scanf(" %d",&c); printf("La traduzione é %c\n",c); return 0; }
- 如果必须使用
char类型存储数据,将scanf的格式符替换为%hhd即可,该格式符专门用于匹配char *类型的指针,修改对应行即可:
scanf(" %hhd",&c);
内容的提问来源于stack exchange,提问作者Tommaso Longo
相关产品推荐
相关产品推荐

