c - 'sprintf' 输出 9 到 12 个字节到大小为 9 的目标
问题描述
我已经检查过这个问题,但我无法弄清楚它如何适用于我的情况。
使用时
char time[9];
sprintf(time, "%2d:%2d:%2d",
timestamp.Hour(),
timestamp.Minute(),
timestamp.Second());
我收到警告
'sprintf' output between 9 and 12 bytes into a destination of size 9
并
在运行代码的微控制器上随机重启(如果它们以某种方式相关)。
那么,这些额外的 3 个字节是从哪里来的呢?我该如何解决这个问题?
Hour()、Minute() 和 Second() 方法实际上返回uint8_t
解决方案
您的编译器显然知道一个uint8_t
值可以产生 1 到 3 位数字,但不知道Hour
,Minute
和Second
函数最多只能返回 2 位数字值。
如果您255
使用"%2d"
格式传递值,您将获得 3 个字符。如果所有三个参数都为 100 或更大,则将 12 个字节写入目标数组。编译器会警告您在给定参数类型的情况下理论上可能发生的错误,但考虑到传递的实际值可能不会发生。(我对它能够发出这个警告有点印象深刻,并不奇怪它不知道这些函数的语义。)
重新启动可能无关紧要。尝试检查通话time
后的内容。sprintf
我想你会发现问题并没有在那里发生,并且警告是虚假的。您可以通过定义来使警告静音char time[12];
,或者您可以忽略警告。
这个诊断是由 gcc 使用选项生成的-Wformat-overflow=2
,记录在这里。
推荐阅读
- python - 如何从列表的现有或反向顺序创建新数组 Python
- c# - C# 字典不起作用,将输入与键值对进行比较时,只有最后一对起作用
- android - Exificient exception "schema_reference.4: Failed to read schema document xxx.xsd" with import keyword
- java - java.lang.Error:未解决的编译问题:
- php - PHP 加法 (+) 功能有限制吗?
- python - Python如何划分非常大的整数?
- python - 如何在python中的函数中将未知数量的参数相乘
- parsing - Haskell Ast -> IO ()
- php - 如何按与模型的自定义附加关系排序
- bash - 如何输出按用户排序的命令列表?